我正在尝试构build一个bash单线程来循环当前目录中的目录,并将内容转换为唯一的焦点,使用目录名作为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
我正在运行的命令的哪部分我不理解,并且正在生成该输出?
你需要删除tar命令周围的backtics。 你也可能想通过xargs来pipe理ls ,以确保bash正确地获取所有的目录:
for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done
反引号捕获tar的输出并试图在循环的每次迭代中作为命令执行。 使用-v选项时, tar打印的第一件事是每个文件(例如drwxrwxr-x )的权限。 在这种情况下,您希望bash 执行 tar命令,而不是捕获输出。
bjlaub对于tar的反引号是正确的,但是你不需要使用ls :
for file in */
将做的伎俩,并妥善处理目录名称与空格。
这里的其他答案是好的,但我想添加另一个选项,以防止只需要目录而不是符号链接等:
for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done
希望这可以帮助!