你有一堆文件夹,其中有一个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?
感谢您的帮助
答案 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
命令。