Answers:
for d in ./*/ ; do (cd "$d" && somecommand); done
for d in ./*/ ; do (cd "$d" && ls); done
,将不起作用。但是,for d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); done
会工作。-在本例中使用ls作为命令。
-bash: cd: ./*/: No such file or directory
最好的方法是完全不使用cd
:
find some/dir -type f -execdir somecommand {} \;
execdir
就像exec
,但是工作目录不同:
-execdir command {} [;|+]
Like -exec, but the specified command is run from the
subdirectory containing the matched file, which is not normally
the directory in which you started find. This a much more
secure method for invoking commands, as it avoids race
conditions during resolution of the paths to the matched files.
不是POSIX。
find
执行这些命令,因此不会知道别名。什么是md
和是.link
一个目录?
bash
:find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;
无需cat
使用wget
,它具有-i
用于从文件中读取URL 的标志。这也与您最初的问题有所不同(因为您似乎只对命名的文件感兴趣,.link
而对可能存在的任何其他文件不感兴趣)。
cd -P .
for dir in ./*/
do cd -P "$dir" ||continue
printf %s\\n "$PWD" >&2
command && cd "$OLDPWD" ||
! break; done || ! cd - >&2
上面的命令不需要做任何子shell,它只是通过交替使用$OLDPWD
和来跟踪其在当前shell中的进度$PWD
。当cd -
外壳交换目录时,基本上交换这两个变量的值。它还会在stderr上工作时为每个目录打印名称。
我只是重新看了一下,并决定我可以在错误处理方面做得更好。它会跳过一个它无法进入的目录cd
-并cd
输出一条有关为什么选择stderr的消息- break
如果您command
执行失败或运行command
以某种方式影响了它返回原始目录的能力,它将带有一个非零的退出代码。- $OLDPWD
。在这种情况下,它也会执行cd -
最后-将生成的当前工作目录名称写入stderr。
youtube-dl
。