ファイルがあります
..
00016_0912RP10R6_RampMotorway9_0912RP10R6_13.646852_100.687103.jpg
00017_0912RP10R6_RampMotorway9_0912RP10R6_13.646956_100.686897.jpg
00018_0912RP10R6_RampMotorway9_0912RP10R6_13.647067_100.686684.jpg
...
持ちたい
00016.jpg
00017.jpg
00018.jpg
サブフォルダを繰り返して名前を変更するための最良のLinuxコマンドは何ですか?
答え1
使用find
:
find . -type f -name '*_*.jpg' -exec sh -c '
for pathname do
newname=${pathname##*/}
newname="${pathname%/*}/${newname%%_*}.jpg"
printf "Would move %s to %s\n" "$pathname" "$newname"
# mv -i "$pathname" "$newname"
done' sh {} +
これは、名前が指定されたパターンと一致する現在のディレクトリ内または下のすべての一般ファイルのパス名を探します。これらのパス名のバッチに対して指定されたパス名を繰り返し、ファイル名を変更する短いシェルスクリプトが実行されます(実際の名前変更は安全のためにコメントアウトされます)。
同様のパス名が与えられると、./a/b/c/foo0_some_other_bits.jpg
シェルスクリプトは./a/b/c/foo0.jpg
最初にディレクトリを削除(作成)してから、最初の文字以降foo0_some_other_bits.jpg
の_
すべてのエントリを削除し、ディレクトリを再追加してそれを変換します。パス名のディレクトリビットは、1つ以上の文字が含まれている場合は削除され置き換えられます_
。これは標準パラメータ拡張を使用して行われます。
globstar
シェルオプションを使用してくださいbash
。
shopt -s globstar # use "set -o globstar" in ksh93, or remove completely in zsh
for pathname in ./**/*.jpg; do
[ -f "$pathname" ] || continue
newname=${pathname##*/}
newname="${pathname%/*}/${newname%%_*}.jpg"
printf "Would move %s to %s\n" "$pathname" "$newname"
# mv -i "$pathname" "$newname"
done
これは上記のコマンドとまったく同じですfind
。唯一の違いは、隠された名前が見つからないことです(shopt -s dotglob
これを追加しました)。
答え2
パラメータ置換を使用する簡単な方法bash
:
for file in *.jpg; do mv "${file}" "${file/_*/.jpg}";done
ファイルがあるディレクトリで実行すると、ファイル全体を繰り返します。
答え3
pax -rw -'s/_[^/]*\.jpg/.jpg/' -'s/.*//' . .
うまくいくかもしれません。