关于bash:如何获取shell脚本中目录中的文件列表?

How to get the list of files in a directory in a shell script?

我正在尝试使用shell脚本获取目录的内容。

我的脚本是:

1
2
3
for entry in `ls $search_dir`; do
    echo $entry
done

其中$search_dir是相对路径。但是,$search_dir包含许多名称中带有空格的文件。在这种情况下,该脚本不会按预期运行。

我知道我可以使用for entry in *,但这只适用于我当前的目录。

我知道我可以改到那个目录,使用for entry in *,然后改回,但是我的特殊情况阻止了我这样做。

我有两个相对路径:$search_dir$work_dir,我必须同时处理这两个路径,读取它们,在其中创建/删除文件等。

那我现在该怎么办?

我用BASH。


1
2
3
4
for entry in"$search_dir"/*
do
  echo"$entry"
done


其他回答:你在这里是伟大的和在线的问题的答案,但这是顶部的谷歌的结果是"获取目录中的文件列表的狂欢"(这是寻找到一个列表文件保存),所以我想我会到这一问题的答案的帖子:

1
ls $search_path > filename.txt

如果你想只按一定的比例(如任何类型:txt文件)

1
ls $search_path | grep *.txt > filename.txt

请注意,路径搜索_美元是可选的;filename.txt LS >将当前目录。


1
2
3
4
5
6
for entry in"$search_dir"/*"$work_dir"/*
do
  if [ -f"$entry" ];then
    echo"$entry"
  fi
done

这是一个办法,它的语法是在我了解到:simpler

1
2
3
4
5
yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
   echo $eachfile
done

当前的工作目录是./但可以替换任何路径。anything.txt *.txt收益你可以很容易地进行检查,将上市公司分为:直ls命令终端。

基本上,你创建一个变量yourfilenames含一切的命令返回的列表元素和单独的回路,你通过它。创建的临时变量eachfile环包含一个单元,它是循环的变通,本案例中的文件名。这是不是一定比其他的答案,但我发现它,因为我已经熟悉的直观的命令的语法是ls环。


1
find"${search_dir}""${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo"{}"


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ 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

变奏曲

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ 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 1recursively搜寻
  • -type f:查找文件,不是目录(d)
  • -not -path '*/\.*'.hidden_files不返回
  • 在prepended ./sed 's/^\.\///g':删除从列表


返回的答案将不接受与文件的前缀。这是使用的

1
2
3
4
for entry in"$search_dir"/*"$search_dir"/.[!.]*"$search_dir"/..?*
do
  echo"$entry"
done

这是另一种方式上市文件的目录(在不使用工具的不同,其他一些有效的答案)。

1
2
3
4
cd"search_dir"
for [ z in `echo *` ]; do
    echo"$z"
done

echo *当前目录所有文件的输出。在每个循环的for打印到标准输出和文件的名称。

如果找的,以及如何在这个目录,然后目录for环广场的内幕:

1
2
3
if [ test -d $z ]; then
    echo"$z is a directory"
fi

test -d检查,如果文件是一个目录。


我的工作与在Linux版(x86 64 _以下作品:GNU / Linux的)

1
2
3
4
for entry in"$search_dir"/*
do
  echo"$entry"
done