名前の最初の部分を動的に削除し、別の場所にコピーする必要があります。私のファイル名は次のとおりです
Voice_XYZZ_1_1801.pdf
Voice_XYZZ_1_1801.ndx
Electon_MNOPQ_1_1801.pdf
Electon_MNOPQ_1_1801.ndx
実行時に音声、電子機器、またはその両方を作成できます。ファイル名から最初の部分を削除する必要があります。次のようにする必要があります。
XYZZ_1_1801.pdf
XYZZ_1_1801.ndx
MNOPQ_1_1801.pdf
MNOPQ_1_1801.ndx
これを達成するためにどのコマンドを使用できますか?
答え1
f
Bourneシリーズシェルを使用していると仮定すると、次のコマンドを使用して、ファイル名変数から最短の先行部分文字列一致(アンダースコアを含む)を削除できます。${f#*_}
前任者。
$ touch Voice_XYZZ_1_1801.pdf Voice_XYZZ_1_1801.ndx Electon_MNOPQ_1_1801.pdf Electon_MNOPQ_1_1801.ndx
$ for f in Voice_* Electon_*; do echo "${f#*_}"; done
XYZZ_1_1801.ndx
XYZZ_1_1801.pdf
MNOPQ_1_1801.ndx
MNOPQ_1_1801.pdf
mv
次のようにファイル名を変更するコマンドで使用できます。
for f in Voice_* Electon_*; do mv "$f" "${f#*_}"; done
次のコマンドを使用して、同様に別の場所にコピーできますcp
。
for f in Voice_* Electon_*; do cp "$f" "newdir/${f#*_}"; done
答え2
これは、コマンドラインからPerlコードの1行を呼び出すことで簡単に実行できます。
ls *_* | perl -ne 'chomp($_); $orig = $_; $_ =~ s/[^_]*_//; rename $orig,$_;'
以下はコードの説明です。
名前に "_"を含むすべてのファイル名を次のコマンドに送信します。
エルエス_|
渡された各文字列に対して、次のコマンドを実行します。
パーライト
ファイル名から改行文字を削除する("ls"コマンドを実行した後の残りの部分)
噛む($_);
単語の最初の部分を削除して「_」が見つかるまで検索してください。
$_ =~ s/[^]*//;
ファイル名の変更
$orig、$_ の名前を変更します。