Bash在子目录中重命名拉链

时间:2012-01-18 08:31:48

标签: bash rename loops mv

你有一堆文件夹,其中有一个zip文件,路径看起来像这样

/folder/subfolder/archive.zip
/folder/subfolder1/archive1.zip
/folder/subfolder2/archive2.zip
/folder/subfolder3/zip3.zip
/folder/subfolder4/zip4.zip
etc...

我需要输出就像这样

/folder/subfolder/preview.zip
/folder/subfolder1/preview.zip
/folder/subfolder2/preview.zip
/folder/subfolder3/preview.zip
/folder/subfolder4/preview.zip
etc...

每个文件夹中也只有一个拉链,所以我不需要处理覆盖,我不需要将每个文件夹中的每个zip重命名为preview.zip,无论每个子目录中的名称我怎么能这样做在bash?

感谢您的帮助

4 个答案:

答案 0 :(得分:4)

这样的事情应该可以胜任:

for j in **/*.zip; do mv "$j" "${j%/*.zip}/preview.zip"; done

正如SiegeX指出的那样,请注意要使用递归通配,你必须设置globstar选项,这只适用于bash 4.x

答案 1 :(得分:3)

您可以使用Bash的参数替换来执行此操作:

bash-3.2$ for archive in folder/subfolder*/*.zip; do
    echo "Archive = ${archive}, Preview = ${archive%/*}/preview.zip"
done
Archive = folder/subfolder/archive.zip, Preview = folder/subfolder/preview.zip
Archive = folder/subfolder1/archive1.zip, Preview = folder/subfolder1/preview.zip
Archive = folder/subfolder2/archive2.zip, Preview = folder/subfolder2/preview.zip
Archive = folder/subfolder3/zip3.zip, Preview = folder/subfolder3/preview.zip
Archive = folder/subfolder4/zip4.zip, Preview = folder/subfolder4/preview.zip

${archive%/*}将从/中的最后一个${archive}中删除所有内容。

这将允许您验证将运行的命令。将其更改为:

mv "${archive}" "${archive%/*}/preview.zip" 

...重命名文件(即使他们的名字中有空格)。

答案 2 :(得分:0)

#!/bin/bash
while read file; do
  echo mv "$file" "${file%/*}/preview.zip"
done < <(find /folder -type f -name "archive*.zip")

注意 :如果输出足够,请删除echo并重新运行脚本以进行实际更改

答案 3 :(得分:0)

这可能对您有用,但尚未经过全面测试:

find /folder -maxdepth 1 -mindepth 1 -type d -exec mv {}/archive*.zip {}/preview.zip \;

在您的示例下非常严格地工作,此 find /folder下的所有目录,最大和最小深度为1(即只有{{1}内的目录},因为这似乎是你想要的)并对每个文件下的文件执行/folder命令。

相关问题