web-dev-qa-db-ja.com

ファイル名から特定の文字列を削除するにはどうすればよいですか?

次のディレクトリにいくつかのファイルがあります:/var/lib/jenkins/bin/

-rwxr-xr-x. 1 root root 4430846 Apr 27 09:45 01-DSP-04.12_03_crc.bin
-rwxr-xr-x. 1 root root 1659036 Apr 27 09:45 01-FL4-04.12_02-crc.bin
-rwxr-xr-x. 1 root root 1659036 Apr 27 09:45 01-FL8-04.12_02-crc.bin
-rwxr-xr-x. 1 root root 1659036 Apr 27 09:46 01-FPGA-04.12_02-crc.bin
-rwxr-xr-x. 1 root root  524328 Apr 27 09:46 01-MMI-04.11_05-crc.bin
-rwxr-xr-x. 1 root root   27692 Apr 27 09:46 01-PIC-04.11_06-crc.bin

また、/var/lib/jenkins/scripts/my_script.shで作業を行うスクリプトがあります。

このスクリプトのファイル名から先頭の「01-」を削除したいのですが。これを行う良い方法はありますか?

私は https://stackoverflow.com/questions/28305134/remove-first-n-character-from-bunch-of-file-names-with-cut から解決策を試しましたが、機能しません私。

次のような出力が得られます。

コマンド

$ for file in /var/lib/jenkins/bin/*; do echo mv $file `echo $file | cut -c4-`; done

出力

mv /var/lib/jenkins/bin/01-DSP-04.12_03_crc.bin r/lib/jenkins/bin/01-DSP-04.12_03_crc.bin
mv /var/lib/jenkins/bin/test.sh r/lib/jenkins/bin/test.sh

ご覧のように、ファイル名ではなくディレクトリ名である最初の3文字が削除されます。ファイル名から21文字後の3文字を削除したい。

これを行うためのより良い方法はありますか?

2
Sunil Shahu

問題は、ディレクトリを含む完全パスを使用していることです。最も簡単な回避策は、最初にcdをターゲットディレクトリに入れ、次にforループを実行することです。

cd /var/lib/jenkins/bin
for file in *; do echo mv "$file" "$(echo "$file" | cut -c4-)"; done

または、シェル自体の 文字列操作 機能を使用します。

cd /var/lib/jenkins/bin
for file in *; do echo mv "$file" "${file#????}"; done

あるいは、Perl-rename(Debianベースのシステムではrenameと呼ばれ、他のシステムではPerl-renameと呼ばれる)を持っている場合は、次のようにすることができます。

rename -n 's|.*/...||' /var/lib/jenkins/bin/*

これが機能することを確認したら、-nを削除して実際に名前を変更します。


ただし、Sundeepがコメントで指摘したように、01-のみを削除する場合は、具体的に削除します。

rename -n 's|.*/01-||' /var/lib/jenkins/bin/*
4
terdon