我试图获得一个目录的内容使用shell脚本。

我的剧本是:

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

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

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

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

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

现在我该怎么办?

PS:我使用bash。


当前回答

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

其他回答

类似于接受的答案-但只列出文件名而不是完整的路径:

这个问题似乎已经回答了一段时间,但我想我还想提供一个答案,只列出所需目录中的文件,而不是完整的路径。

    #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中查找子字符串的更多信息可以在这里找到。

在这里的其他答案是伟大的,回答你的问题,但这是顶级谷歌结果“bash获得目录中的文件列表”,(这是我正在寻找保存文件列表),所以我想我会张贴一个答案的问题:

ls $search_path > filename.txt

如果你只想要一个特定的类型(例如任何。txt文件):

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

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

这是一种方法,它的语法对我来说更容易理解:

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

./是当前工作目录,但可以替换为任何路径 *.txt返回任何内容。txt 您可以通过直接在终端中键入ls命令轻松地检查将列出的内容。

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

find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
$ 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':从结果列表中删除前置的./