为什么我的 ls 输出循环不起作用?

为什么我的 ls 输出循环不起作用?

我正在尝试将目录名称输入 for 循环。我的代码如下:

td='/Test/TopDir/'
cd "$td" 
for x in $(ls -d */ | cut -f1 -d'/'); do
  echo x=$x
done

运行 ls 命令时,我运行的顶级目录如下所示:

ls -l
drwxrwxrwx    4 Jason    users         4096 May  6 06:36 2014-02-02 - Jebby (
drwxrwxrwx    3 Jason    users         4096 May  6 06:09 2014-02-04 - Jebby (
drwxrwxrwx    2 root     root          4096 May  6 06:09 @eaDir
-rw-r--r--    1 Jason    users      3956225 Jan 26 10:17 DSC01062.JPG
-rw-r--r--    1 Jason    users      3927603 Jan 26 10:18 DSC01063.JPG

我的for循环的结果如下:

x=2014-02-02
x=-
x=Jebby
x=(
x=2014-02-04
x=-
x=Jebby
x=(
x=@eaDir

正如您所看到的,for 循环将目录名称分成每个空格后面的子部分。在此示例中,我只希望 For 循环对三个目录执行三次:

  1. 2014-02-02 - 杰比 (
  2. 2014-02-04 - 杰比 (
  3. @eaDir

我究竟做错了什么?

答案1

ls如果可能的话,避免解析 shell 脚本中的输出(或至少是文件名部分) 。当文件名包含空格时,它总是会出现分词问题。

如果你想迭代目录,你可以使用一个简单的 shell glob 来实现,即

for d in */; do 
  echo "$d"
done

ls命令只能用于在终端中以人类可读的形式显示目录列表。

答案2

使用@mikserv的建议, 你可以做

cd /Test/TopDir/
set -- "$PWD" */
cd /somewhere/else
td=$1 ; shift 
for x; do
  echo x="${td}/$x"
done

相关内容