我有一堆文件,每个文件都在自己的子目录中。我需要编写一个脚本来重命名每个文件,使其与其目录具有相同的名称:例如,给出:
./1111/1234.pdf
./2222/2345.pdf
./1234/3214.pdf
我需要将它们重命名为:
./1111/1111.pdf
./2222/2222.pdf
./1234/1234.pdf
我怎样才能做到这一点?
答案1
假设您的 shell 是 zsh,输入autoload -U zmv
您的~/.zshrc
,然后运行
zmv '(*)/*.pdf' '$1/$1.pdf'
答案2
以下bash
脚本在父目录中调用时执行该作业。即使文件并不都具有相同的扩展名(它们在您有限的示例中具有相同的扩展名,但这可能是巧合),它也会这样做:
#!/bin/bash
function dirnametofilename() {
for f in $*; do
bn=$(basename "$f")
ext="${bn##*.}"
filepath=$(dirname "$f")
dirname=$(basename "$filepath")
mv "$f" "$filepath/$dirname.$ext"
done
}
dirnametofilename ./????/*
此处的调用假定当前目录的子目录中的任何文件的名称包含四个字符。您可以将最后一行交换为:
dirnametofilename $*
并将文件名指定为脚本的参数
下面创建了一个更深的层次结构并使用 find 来定位文件。确保export -f
启动bash
者find
了解该功能:
mkdir -p x/y/z/1111 x/y/z/2222 x/y/z/1234
touch x/y/z/1111/1234.pdf
touch x/y/z/2222/2345.pdf
touch x/y/z/1234/3214.pdf
function dirnametofilename() {
for f in $*; do
bn=$(basename "$f")
ext="${bn##*.}"
filepath=$(dirname "$f")
dirname=$(basename "$filepath")
mv "$f" "$filepath/$dirname.$ext"
done
}
export -f dirnametofilename
find . -name "*.pdf" -exec bash -c 'dirnametofilename "{}"' \;
# and look at the result
find x
答案3
echo ./1111/1234.pdf | perl -pe '$_.=$_; s/\/(.*?)\/.+\.(.*?)$/\/$1\/$1\.$2/' | xargs -n 2 mv