find コマンドを使用してファイル名の前に追加します。

find コマンドを使用してファイル名の前に追加します。

どのような方法がありますか?ただfindコマンドを使用してくださいファイル名の前に文字列を追加しますか?

だから:

201a.txt
201b.png
...

次のようになります。

foo_201a.txt
foo_201b.png
...

これ:

find . -name '201*' -execdir mv {} foo_{} \;

{}その部分にはファイル名の前に先行文字が含まれているため、./動作しませんfoo_./201*

検索のみを使用してこれを行うことができない場合は、ファイル名に文字列を追加する最も移植可能な方法(読み取り:coreutilsのみ、シェルスクリプトなし、わかりやすい)は何ですか?

答え1

いいえ。ただし、このrenameコマンドは簡単な解決策を提供します。

$ ls -1
201a.txt
201b.png
$ rename 201 foo_201 201*
$ ls -1
foo_201a.txt
foo_201b.png
$

答え2

どうですか?

find . -name '201*' -execdir basename {} \; | xargs -I{} mv {} foo_{}

basenameによって提供され、coreutilsによってxargs提供されるため、findutils少なくともfind -execdir移植性が必要です。


または、POSIXシェル機能を使用してください。

find . -name '201*' -execdir sh -c 'mv "$1" "foo_${1#*/}"' sh {} \;

答え3

これは単独では不可能でありfind、GNU findでも可能ではありません。 GNU findはコマンドラインプレフィックスを削除し、代わりに-printf foo_%p他のプレフィックスを追加したファイルを印刷することができますが、-printそうではありません-exec

find -printf 'mv foo_%p …' | sh危険にさらしたい場合は、使用できます。これは「飼いならされた」ファイル名にのみ機能し、ファイル名にスペース、引用符、その他の特殊文字が含まれているとひどく壊れる可能性があります。使用しないでください。)

これを行う標準的な方法(すべてのPOSIXシステムで動作する方法や一般的な方法と同様)は、シェルを呼び出して文字列操作を実行することです。

find . -name '201*' -exec sh -c 'mv -- "$0" "${0%/*}/foo_${0##*/}"' {} \;

-execdirGNU拡張で移植性が必要なので、私はそれを使用しません。{}引数としてシェルに渡されることに注意してください。シェルコード内では絶対に使用しないでください{}。移植性がないためであるだけでなく、最も重要なのは、ファイル名がシェルコードと解釈され、ファイル名に特殊文字が含まれていると失敗するからです。

最新のPOSIXシステム(過去10年間のすべてのシステム)では、シェル呼び出しをバッチ処理することでこのコマンド速度をわずかに向上させることができます。

find . -name '201*' -exec sh -c 'for x do mv -- "$x" "${x%/*}/foo_${x##*/}"; done' sh {} +

またはksh、bashまたはzshからfind

set -o globstar # ksh only
shopt -s globstar # bash only
for x in **/201*; do
  mv -- "$x" "${x%/*}/foo_${x##*/}"
done

答え4

*代わりに、アスタリスク()を使用してその./部分を削除できます。

find * -name '201*' -exec mv {} foo_{} \;  

関連情報