8

このファイルパターンを変換して、bashを使用して一連のファイルの名前を変更したいと思います。

prefix - name - suffix.txt

これに:

name.txt

そのために、次のスクリプトを作成しました。

find . -name "*.txt" | while read f
do
  mv "${f}" "${f/prefix - /}"
done

find . -name "*.txt" | while read f
do
  mv "${f}" "${f/ - suffix/}"
done

動作しますが、1つのループで名前の変更を行いたいのですが。出来ますか?

4

4 に答える 4

10

正規表現を使用した、楽しみのための別のアプローチ:

regex='prefix - (.*) - suffix.txt'
for f in *.txt; do
    [[ $f =~ $regex ]] && mv "$f" "${BASH_REMATCH[1]}.txt"
done

実際、ここで単純なパターン'* .txt'を使用すると、2つの問題が発生します。

  1. 広すぎます。一致しない多くのファイルに正規表現を適用する必要がある場合があります。
  2. 現在のディレクトリに多数のファイルがある場合、コマンドラインがオーバーフローする可能性があります。

を使用findすると手順が複雑になりますが、より正確です。

find . -maxdepth 1 -regex 'prefix - .* - suffix.txt' -print0 | \
  while read -d '' -r; do
   [[ $REPLY =~ $regex ]] && mv "$REPLY" "${BASH_REMATCH[1]}.txt"
  done
于 2012-08-20T01:28:25.830 に答える
3

にアクセスできる場合はGNU sed、正規表現を使用して次のようなことを実行できます。

for i in *.txt; do mv "$i" "$(echo $i | sed -r 's/([^-]*)\s-\s(.*)\s-\s([^-]*)\.txt/\2.txt/')"; done
于 2012-08-20T01:21:05.980 に答える
0

emacsインストールしている場合。この機能を使用できますdired

bash

# open your dir with emacs
emacs /path/to/your/dir

emacs

  • を押して、すべてのファイルにマークを付けます。*%Enter\.txt$Entertxt
  • を押して名前を変更します。%rEnter.*- \(.*\) -.*Enter\1.txtEnter
于 2012-08-20T03:17:07.977 に答える
0

あなたはこれを使うことができます:

find . -name "*.txt" -print0 | awk -v RS="\0" -v ORS="\0" '{print $0;sub(/^prefix - /,""); sub(/ - suffix.txt$/,".txt"); print $0; }' | xargs -0 -n 2 mv

これは、より明確に次のように書くことができます。

find . -name "*.txt" -print0 |
awk -v RS="\0" -v ORS="\0" '{
  print $0;
  sub(/^prefix - /,""); 
  sub(/ - suffix.txt$/,".txt"); 
  print $0;
}' |
xargs -0 -n 2 mv
于 2012-08-20T01:29:49.137 に答える