bash 单行循环遍历目录会引发错误

bash 单行循环遍历目录会引发错误

我正在尝试构建一个 bash 单行程序来循环遍历当前目录中的目录并将内容打包成唯一的 tar 文件,使用目录名称作为 tar 文件名。我已经完成了基本工作(查找目录名称,并使用这些名称打包它们),但我的循环抛出了一些错误消息,我无法理解它从哪里获取它尝试运行的命令。

以下是最有效的一行代码:

for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done

“奇怪”的输出是:

-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found

我正在运行的命令的哪一部分我不理解并且产生了那个输出?

答案1

您需要删除tar命令两侧的反引号。您还可能需要使用管道来ls确保xargsbash 正确获取所有目录:

for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done

反引号捕获 的输出tar并尝试在循环的每次迭代中将其作为命令执行。tar使用 -v 选项时打印的第一件事是每个文件(例如 )的权限drwxrwxr-x。在这种情况下,您希望 bash执行tar 命令,不捕获输出。

答案2

比耶劳布关于 周围的反引号是正确的tar,但是您不需要使用ls

for file in */

将会达到目的并能正确处理带有空格的目录名。

答案3

这里的其他答案都很好,但我想添加另一个选项,以防您只需要获取目录而不是符号链接等:

for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done 

希望这可以帮助!

相关内容