我需要浏览一整套子目录,每次找到一个名为0的子目录时,都必须进入它。在那里,我需要执行tar命令来压缩一些文件。
我尝试了以下
find . -type d -name "0" -exec sh -c '(cd {} && tar -cvf filename.tar ../PARFILE RS* && cp filename.tar ~/home/directoryForTransfer/)' ';'
似乎有用。但是,因为这是在名为0的许多目录中完成的,所以它将始终覆盖以前的filename.tar(并且我将丢失有关其创建位置的信息)。
解决这个问题的一种方法是使用$ pwd作为文件名(最后是+ .tar)。
我尝试了双嘀嗒,反叛等,但我从未设法获得正确的文件名。
"$PWD"".tar", `$PWD.tar`, etc
有什么想法吗?任何其他方式都可以,只要我可以将文件的名称与它创建的目录链接起来。
我需要这样才能轻松地将directoryToTransfer从群集传输到我的家用电脑。
答案 0 :(得分:1)
您可以尝试"${PWD//\//_}.tar"
。但是,您必须使用bash -c
代替sh -c
。
修改强>
所以现在你的代码应该是这样的:
find . -type d -name "0" -exec bash -c 'cd {} && tar -cvf filename.tar ../PARFILE RS* && cp filename.tar ~/home/directoryForTransfer/"${PWD//\//_}.tar"' ';'
我个人并不喜欢-exec
的使用find
标记,因为它会降低代码的可读性,并为每个文件分配新进程。我会这样做,这应该工作,除非某个地方的文件名包含换行符(这是非常不可能的)。
while read dir; do
cd {} && tar -cvf filename.tar ../PARFILE RS* && cp filename.tar ~/home/directoryForTransfer/"${PWD//\//_}.tar"
done < <(find . -type d -name "0")
但这只是我个人的偏好。 -exec
变种也应该有用。
答案 1 :(得分:1)
您可以使用-execdir
中的find
选项在每个找到的目录中下载,然后运行tar
命令以大大简化您的tar
命令:
find . -type d -name "0" -execdir tar -cvf filename.tar RS* \;
如果您希望在~/home/directoryForTransfer/
中创建tar文件,请使用:
find . -type d -name "0" -execdir tar -cvf ~/home/directoryForTransfer/filename.tar RS* \;