ディレクトリ内の多数のファイルの名前をバッチで変更し、前の番号とハイペンがファイル名から削除されるようにします。
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
Linuxコマンドでこれを行うにはどうすればよいですか?
これでうまくいくはずです:
rename 's/^[0-9]*-//;' *
最初からブロック[0-9]
(つまり、数値)を何度も取得し、次にハイフン-
を取得して、ファイル名から削除します。
rename
がマシンにない場合、ループとmv
を使用できます。
mv "$f" "${f#[0-9]*-}"
$ ls
23-aa hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa hello aaa23-aa
または:
$ ls
23-a aa23-a hello
$ for f in *;
> do
> mv "$f" "${f#[0-9]*-}"
> done
$ ls
a aa23-a hello
以下のコマンドを実行すると、このコマンドの方が良いと思います:
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
ここに
ls *-現在のフォルダー内のファイルをリストします
sed -e-式を実行します
p;-古いファイル名を出力
s/old-name/new-name /-新しいファイル名を生成
xargs -n2-mvへの2つの引数を処理します
mv-2つのパラメーターを取得し、移動操作を行います
推奨: mvを実行する前に、echoで達成したいことを確認してください。
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo
次の例の名前変更
SCCF099_FG.gz5329223404623884757.tmp to
SCCF099_FG.gz
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv
最初の数字が常に同じ長さの場合:
for F in *new ; do
mv $F ${F:8}
done
${parameter:number}
は部分文字列展開を行います-8文字目から文字列を取得します。
他のケースを処理するために、拡張で利用できる他の多くの文字列編集があります。
renamer の使用(Windows、Mac、およびLinuxフレンドリー):
$ renamer --find '/\d+-(.*)/' --replace '$1' *
これにより、現在のディレクトリ内のすべてのファイルの先頭からすべての数字と最初のハイフンが削除されます。
vimv では、Vimのテキスト編集機能を使用して複数のファイルの名前を変更できます。
Vimvと入力すると、Vimウィンドウが開き、すべてのファイルが一覧表示され、パターンマッチング、視覚的な選択などを行って名前を編集できます。 Vimを終了すると、ファイルの名前が変更されます。
README=ファイルの screencast は、元のポスターの質問をどのように解決するかを示しています。
[免責事項:私はツールの作成者です]
便利なGUIツールpyRenamer
もあります https://wiki.ubuntuusers.de/pyRenamer/
「* .mp3 * .mp4の名前を変更する」ようなものが本当に好きです。
しかし、他の答えのどれも私にそれを与えません。そこで、私はそれを行うためのhaskellプログラムを作成しました。
https://hackage.haskell.org/package/batch-rename
これでできること:batch_rename "DCIM * .jpg" "* .png"
このツールを使用できます: rnm
あなたがしたいことをするコード:
rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'
-fo
はファイル専用モード用です-dp
はディレクトリの深さです(-1
は無制限の深さを意味します)。-rs
は置換文字列です。 \d+-
regexは空の文字列に置き換えられています。-ss
は検索文字列で、^\d+-
正規表現でファイルを検索します。 (ただし、いくつかの無害なエラーメッセージが画面に出力される場合は省略できます)。