以下のような名前のファイルが複数あります。
2313_ABCDEAUG2014_PQRST_0_.pdf
3244_ABCDEAUG2014_PQRST_0_.pdf
4234_ABCDEAUG2014_PQRST_0_.pdf
次の形式でファイル名を変更したくありません。
AZ-2014-08-2313.pdf
AZ-2014-08-3244.pdf
提案してください。
答え1
perl-rename
作業を簡単に実行できる非常にクールだと思われるソフトウェアがあります。
perl-rename 's/^(.*)_.*AUG2014.*/AZ-2014-08-$1.pdf/' *.pdf
HTH、乾杯、
答え2
ファイル名に一重引用符や改行文字が含まれていない場合:
ls | sed -n "s/$/:JAN1FEB2MAR3APR4MAY5JUN6JUL7AUG8SEP9OCT10NOV11DEC12/
s/\(\(.*\)_.*\(...\)\([0-9]\{4\}\)_.*\):.*\3\([0-9]*\).*/mv -i -- '\1' 'AZ-\4-\5-\2.pdf'/p"
| sh
実際の名前変更を追加します。
sed
これは、いくつかの翻訳を実行するために一般的なトリックを使用することです(ここAUG
- > 8
)。
JAN1FEB2...
パターンスペースの最後にマッピングテーブル(ここ)を追加し、検索に逆参照()を使用します\(...\).*\1\([0-9]*\)
。私たちは、マッピングテーブルからそれに続く数字の順序でAUG
キャプチャし\3
てインポートしています。\5
\3
答え3
以下では、すべてのPDFファイルを繰り返して新しい名前の形式にコピーし、元のファイルを維持して要件を満たしていることを確認できます。
for file in $(ls *AUG2014*pdf) ; do newName=$(echo $file | awk -F_ '{ print $1 }') ; cp $file AZ-2014-08-$newName.pdf ; done
ls *AUG2014*pdf
- Aug2014を含み、pdfで終わるすべてのファイルを一覧表示します。
for aString in <list> ; do someCommand $aString ; done
- それぞれaStringで参照されるリストのすべての要素を繰り返します。 aString を参照する前に、ドル記号 $ を使用してください。
awk -F_
- "_"区切り文字に基づいて文字列をトークンに分割します。上記のコマンドは最初のトークンを出力します。
同じ番号で始まる複数のファイルがないように注意してください。存在する場合は、2つのファイルを同じファイル名にコピーして、1つが別のファイルを上書きできます。古いファイル数と新しいファイル数を確認してください。
答え4
filelist='2313_ABCDEAUG2014_PQRST_0_.pdf 3244_ABCDEAUG2014_PQRST_0_.pdf 4234_ABCDEAUG2014_PQRST_0_.pdf'
for i in $filelist; do
id=$(echo $i|awk -F_ '{print $1}');
mv $i AZ-2014-08-$newname.pdf;
done
年または月が異なる場合があります。この場合、新しい名前を作成するには、保存したい名前の他の部分を抽出する必要があります。