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

我的剧本是:

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

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

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

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

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

现在我该怎么办?

PS:我使用bash。


当前回答

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

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

其他回答

for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done
search_dir=/the/path/to/base/dir
for entry in "$search_dir"/*
do
  echo "$entry"
done
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"

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

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

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

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

ls $search_path ./* |grep ".txt"|
while IFS= read -r line
do 
   echo "$line"
done