それぞれ独自のサブディレクトリに複数のファイルがあります。各ファイルの名前をディレクトリと同じ名前に変更するスクリプトを作成する必要があります。たとえば、次のようになります。
./1111/1234.pdf
./2222/2345.pdf
./1234/3214.pdf
名前を次のように変更する必要があります。
./1111/1111.pdf
./2222/2222.pdf
./1234/1234.pdf
どうすればいいですか?
答え1
シェルが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 ./????/*
ここでの呼び出しでは、現在のディレクトリのサブディレクトリにあるすべてのファイルの名前に4文字が含まれていると仮定します。最後の行を次に置き換えることができます。
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