findコマンドを使用してファイル名を逆に変更しますか?

findコマンドを使用してファイル名を逆に変更しますか?

Findは素晴らしいユーティリティであり、非常に汎用性があります。既存のファイル名にサフィックスまたはプレフィックスを追加してファイル名を変更しようとしています。クール。

find -name "*" -exec mv {} {}.yo \;

今理解できない部分ですね -上記の作業をキャンセルする必要がある場合はどうすればよいですか?

編集する -
接頭辞を付けることができないことがわかりました。この問題を解決する方法はありますか?

find  -type f -name "*"  -exec mv {} yu.{} \;
mv: cannot move './o.txt.yu.yu' to 'yu../o.txt.yu.yu': No such file or directory

ベストアンサー1

find . -depth -name '*.yo' -exec sh -c '
  ret=0
  for file do
    mv -i -- "$file" "${file%.yo}" || ret=$?
  done
  exit "$ret"' sh {} +

file.yoこれにより、サフィックスを追加するために使用したコマンドなどのディレクトリを含む、すべての種類のファイル名なしでに.yo変更されます。最初の名前に名前を変更してからその名前に変更すると、もはや存在しないため機能しません。file.yodir.yodirdir.yo/file.yodir.yo/filedir.yo

-depthほぼ常にバッチの名前変更を使用する方が良いので、常に使用することをお勧めします。覚えておくべき唯一のことは-prune

含めるディレクトリコンポーネントへのフルパスを使用するため、プレフィックスを使用することは機能しませんmv {} prefix{}{}、ファイル名にプレフィックスを追加するには次のようなものが必要です。

find . -depth -type f -exec sh -c '
  ret=0
  for file do
    dir=${file%/*} name=${file##*/}
    mv -i -- "$file" "$dir/yu.$name" || ret=$?
  done
  exit "$ret"' sh {} +

今回は-type f名前の変更に使用します。定期的な以下を含む他のすべての種類のファイルを除くファイル目次先入選出装備シンボリックリンク、等。

mmvzshこれらの作業を手動で実行する代わりに、Or'sなどの専用のバッチ名変更ツールを使用することをお勧めしますzmv

存在するzsh

autoload -Uz zmv
zmv '(**/)(*).yo(#qD)' '$1$2'       # remove .yo suffix
zmv '(**/)(*)(#qD.)'   '${1}yu.$2'  # add yu. prefix to regular files

(#q...)あるグローバル予選ここで、Dzmvはfindデフォルトで隠しファイルまたは隠しディレクトリのファイルも考慮するように指示し、s.と同じです。find-type f

おすすめ記事