findを使用して複数のファイル名を操作する方法は?

findを使用して複数のファイル名を操作する方法は?

ファイル名の文字列を変更するには、次のコマンドをどのように改善できますか?

find . -type f -name '*<today>*' -exec mv {} {}_renamed \;

実際、私のディレクトリには、名前に今日の日付を含むいくつかのファイルがあります。ファイル名のうち、日付文字列だけが今日の日付から昨日の日付に変更されるように、すべてのファイルの名前を変更したいと思います。

ファイル名にサフィックスやプレフィックスを追加したくなく、むしろファイル名を操作したいと思います。

たとえば、
コマンドファイル名の前にはxxx20170821yyyy.ppp
コマンドファイル名が続きます。xxx20170820yyyy.ppp

そして、名前に文字列を含むすべてのファイルに対してこの操作を繰り返します20170821

ベストアンサー1

renamePerlコマンドの一部として使用されます。

find . -type f -name '*20170919*' -execdir 
rename -n 's/20170919/20170918/' '{}' \;

execdir返された相対パスにあるファイルに対して実行するためにコマンドの一部を実行するときに使用されますexecdir。これにより、ファイルのフルパス(現在の作業ディレクトリに基づく)が渡されず、同じフォルダが使用されなくなります。模様名前変更エラーはファイル名自体ではありません。

すべてのファイルが単一のディレクトリにある場合は、次の行でrename十分です。

rename -n 's/20170919/20170918/' *20170919*

-n名前の変更によって実際の名前が変更されたと思われる場合は、削除してください。-v名前の変更内容を表示するには追加する必要があります。

最後に、毎日複数のファイルに対してこれを行うには、今日の日付が必要な場合があります。次に、二重引用符の間にdate次のコマンド$(...)(コマンドの置き換え)を使用します。

find . -type f -name "*$(date +"%Y%m%d")*" -execdir 
rename -n "s/$(date +"%Y%m%d")/$(date -d "-1day" +"%Y%m%d")/" '{}' \;

PS、シェルを使用しているので、代わりに使用するか、csh新しいシェルに切り替えることをお勧めします。`...`$(...)bashzsh

find ./ -type f -name "*`date +"%Y%m%d"`*" -execdir 
rename -n "s/`date +"%Y%m%d"`/`date -d "-1day" +"%Y%m%d"`/" '{}' \;

おすすめ記事