重命名目录中的所有文件,同时保留名称的相同初始部分

重命名目录中的所有文件,同时保留名称的相同初始部分

我有一个充满文件的目录。我想将所有与 *.py 匹配的文件重命名为 -backup.py。我怎么做。

我知道我可以在 *.py 中使用 for i,但从那里我不确定如何保留初始名称并将备份附加到所有名称。

答案1

for i in *.py
do
    mv "$i" `echo "$i" | sed 's/\.py$/-backup.py/'`
done

答案2

与邪恶汤相同find

find . -name '*.py' -exec bash -c 'mv "$1" "${1%.py}-backup.py"' _ {} \;

或者如果您不想启动一个实例对于找到的每个文件:

find . -name '*.py' -exec bash -c 'for f; do mv "$f" "${f%.py}-backup.py"; done' _ {} +

find如果您有大量文件,该解决方案可能会更好,因为通配符很慢。请随意添加一个-n选项mv(无破坏)或一个-v选项(详细)。

答案3

其本质与 unxnut 的答案相同,但我认为使用 sed 来完成像剥离扩展这样简单的事情就太过分了:

for f in ./*.py; do mv "$f" "${f%.py}-backup.py"; done

${f%.py}是变量 $f,从.py末尾删除。您还可以使用 删除从头开始的内容${f#whatever}。对于递归性(即在当前目录和所有子目录中工作),假设您有 bash 4+,您可以使用 globstar:

shopt -s globstar
for f in ./**/*.py; do mv "$f" "${f%.py}-backup.py"; done

或者,您可以使用 rename —— 实际上有两个不同的程序使用这个名称,您使用哪一个将取决于您对 *nix 的风格。 perl-rename(由 Debian 及其衍生版本使用,例如 Ubuntu 等):

rename 's/\.py$/-rename.py/' ./*.py

另一个重命名将使用以下语法:

rename .py -backup.py ./*.py

for当然,循环更mv便携:第一个非递归循环是 POSIX,因此可以在任何地方的每个 *nix 上工作,除了一些博物馆作品。

相关内容