ファイル名を親フォルダ名に変更

ファイル名を親フォルダ名に変更

それぞれ独自のサブディレクトリに複数のファイルがあります。各ファイルの名前をディレクトリと同じ名前に変更するスクリプトを作成する必要があります。たとえば、次のようになります。

./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ランチャーが機能を理解bashfindていることを確認してください。

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

関連情報