我正在尝试构建一个 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
确保xargs
bash 正确获取所有目录:
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
希望这可以帮助!