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

时间:2010-03-13 06:03:45

标签: bash shell directory-listing

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

我的脚本是:

for entry in `ls $search_dir`; do
    echo $entry
done

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

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

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

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

那我现在该怎么办?

PS:我使用bash。

10 个答案:

答案 0 :(得分:215)

for entry in "$search_dir"/*
do
  echo "$entry"
done

答案 1 :(得分:21)

这里的其他答案很棒并且回答了你的问题,但这是" bash获取目录中文件列表的最佳google结果",(我正在寻找保存文件列表的文件列表)所以我想我会回答这个问题:

ls $search_path > filename.txt

如果您只想要某种类型(例如任何.txt文件):

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

请注意$ search_path是可选的; ls> filename.txt将执行当前目录。

答案 2 :(得分:17)

for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done

答案 3 :(得分:13)

这是一种方法,我可以更简单地理解语法:

yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
   echo $eachfile
done

./是当前的工作目录,但可以用任何路径替换 *.txt返回anything.txt
您可以直接在终端中输入ls命令来查看将要列出的内容。

基本上,您创建一个变量yourfilenames,其中包含list命令作为单独元素返回的所有内容,然后循环遍历它。循环创建一个临时变量eachfile,它包含它循环的变量的单个元素,在本例中是一个文件名。这并不一定比其他答案更好,但我发现它很直观,因为我已经熟悉ls命令和for循环语法。

答案 4 :(得分:10)

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

答案 5 :(得分:1)

$ 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':从结果列表中删除前置的./

答案 6 :(得分:0)

这是在目录内列出文件的另一种方法(使用其他工具,效率不如其他一些答案)。

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检查文件是否为目录。

答案 7 :(得分:0)

接受的答案将不会返回带有前缀的文件。 为此使用

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

答案 8 :(得分:-1)

在我使用的Linux版本(x86_64 GNU / Linux)之后的工作:

for entry in "$search_dir"/*
do
  echo "$entry"
done

答案 9 :(得分:-2)

只需输入以下简单命令:

ls -d */