我试图获得一个目录的内容使用shell脚本。
我的剧本是:
for entry in `ls $search_dir`; do
echo $entry
done
其中$search_dir是一个相对路径。但是,$search_dir包含许多名称中带有空格的文件。在这种情况下,该脚本不能按预期运行。
我知道我可以在*中使用for条目,但这只适用于我的当前目录。
我知道我可以更改到该目录,使用*的入口,然后更改回来,但我的特殊情况阻止了我这样做。
我有两个相对路径$search_dir和$work_dir,我必须同时工作,读取它们,创建/删除它们中的文件等。
现在我该怎么办?
PS:我使用bash。
类似于接受的答案-但只列出文件名而不是完整的路径:
这个问题似乎已经回答了一段时间,但我想我还想提供一个答案,只列出所需目录中的文件,而不是完整的路径。
#search_dir=/the/path/to/base/dir/
IFS=$'\n' #for in $() splits based on IFS
search_dir="$(pwd)"
for entry in $(ls $search_dir)
do
echo $entry
done
如果还想过滤特定文件,可以添加grep -q语句。
#search_dir=/the/path/to/base/dir/
IFS=$'\n' #for in $() splits based on IFS
search_dir="$(pwd)"
for entry in $(ls $search_dir)
do
if grep -q "File should contain this entire string" <<< $entry; then
echo "$entry"
fi
done
引用:
更多关于IFS的信息可以在这里找到。
关于在shell中查找子字符串的更多信息可以在这里找到。
下面是列出目录内文件的另一种方法(使用不同的工具,不如其他一些答案有效)。
cd "search_dir"
for [ z in `echo *` ]; do
echo "$z"
done
echo *输出当前目录下的所有文件。for循环遍历每个文件名并输出到stdout。
此外,如果在目录中查找目录,则将其放在for循环中:
if [ test -d $z ]; then
echo "$z is a directory"
fi
Test -d检查文件是否为目录。
$ pwd; ls -l
/home/victoria/test
total 12
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 a
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 b
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 c
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:32 'c d'
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 d
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32 dir_a
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32 dir_b
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:32 'e; f'
$ find . -type f
./c
./b
./a
./d
./c d
./e; f
$ find . -type f | sed 's/^\.\///g' | sort
a
b
c
c d
d
e; f
$ find . -type f | sed 's/^\.\///g' | sort > tmp
$ cat tmp
a
b
c
c d
d
e; f
变化
$ pwd
/home/victoria
$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2
$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2
注:
. :当前文件夹
删除-maxdepth 1以递归搜索
-type f:查找文件而不是目录(d)
-not -path '*/\。*':不返回.hidden_files
sed ' s / ^ \。\///g':从结果列表中删除前置的./
类似于接受的答案-但只列出文件名而不是完整的路径:
这个问题似乎已经回答了一段时间,但我想我还想提供一个答案,只列出所需目录中的文件,而不是完整的路径。
#search_dir=/the/path/to/base/dir/
IFS=$'\n' #for in $() splits based on IFS
search_dir="$(pwd)"
for entry in $(ls $search_dir)
do
echo $entry
done
如果还想过滤特定文件,可以添加grep -q语句。
#search_dir=/the/path/to/base/dir/
IFS=$'\n' #for in $() splits based on IFS
search_dir="$(pwd)"
for entry in $(ls $search_dir)
do
if grep -q "File should contain this entire string" <<< $entry; then
echo "$entry"
fi
done
引用:
更多关于IFS的信息可以在这里找到。
关于在shell中查找子字符串的更多信息可以在这里找到。