web-dev-qa-db-ja.com

bashの文字を削除して複数のファイルの名前を変更するにはどうすればよいですか?

各ファイル名の最初の5文字を​​削除して、ディレクトリ内の複数のファイルの名前を変更する必要があります。
バッシュ/シェルでこれを行うにはどうすればよいですか? Ubuntu 11.10を使用しています。ありがとう。

10
wlk

少しのsedを含む単純なforループでうまくいきます:

% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbaz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxfoo  
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 bar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 foo

sedの代替 ​​regex は、任意の5文字(.は、文字列(^)を削除します。

11
James O'Gorman

Bashには驚くべきスクリプトの可能性がいくつかあります。これが1つの方法です。

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

それをテストする便利な方法wouldは、コマンドの前にエコーを追加することです:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

6つの疑問符は、5文字を超えるファイル名に対してのみこれを試行することを保証します。

9
Ladadadada

Sedを使用してこれを行うことができます

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done
5
user9517

すべての素晴らしい答え、ありがとう。これは私の場合にうまくいきました:

rename 's/^.......//g' *
5
wlk

私の2セント ':

for file in *; do mv $file ${file:5}; done

${file:n}は、文字列nの最初のfile文字を削除します。

1
dkcm