ファイル名の文字列を変更するには、次のコマンドをどのように改善できますか?
find . -type f -name '*<today>*' -exec mv {} {}_renamed \;
実際、私のディレクトリには、名前に今日の日付を含むいくつかのファイルがあります。ファイル名のうち、日付文字列だけが今日の日付から昨日の日付に変更されるように、すべてのファイルの名前を変更したいと思います。
ファイル名にサフィックスやプレフィックスを追加したくなく、むしろファイル名を操作したいと思います。
たとえば、
コマンドファイル名の前にはxxx20170821yyyy.ppp
コマンドファイル名が続きます。xxx20170820yyyy.ppp
そして、名前に文字列を含むすべてのファイルに対してこの操作を繰り返します20170821
。
答え1
rename
Perlコマンドの一部として使用されます。
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
新しいシェルに切り替えることをお勧めします。`...`
$(...)
bash
zsh
find ./ -type f -name "*`date +"%Y%m%d"`*" -execdir
rename -n "s/`date +"%Y%m%d"`/`date -d "-1day" +"%Y%m%d"`/" '{}' \;