GNU/Linux >> Linux の 問題 >  >> Linux

ファイル名に先行ゼロを追加する Linux シェル スクリプト

rename の使用 (prename 場合によっては) Perl と共にインストールされることもあるスクリプトの場合、Perl 式を使用して名前の変更を行うことができます。名前の競合がある場合、スクリプトは名前の変更をスキップします。

以下のコマンドは、4 桁以下の数字の後に「.txt」拡張子が続くファイルのみの名前を変更します。そのパターンに厳密に準拠していないファイルの名前は変更されません。 4 桁を超える名前は切り捨てられません。

rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *

いくつかの例:

Original    Becomes
1.txt       0001.txt
02.txt      0002.txt
123.txt     0123.txt
00000.txt   00000.txt
1.23.txt    1.23.txt

これまでに与えられた他の回答は、パターンに準拠していないファイルの名前を変更しようとしたり、数字以外の文字を含むファイル名のエラーを生成したり、名前の衝突を引き起こす名前の変更を実行したり、名前にスペースが含まれるファイルの名前を変更しようとして失敗したりします。おそらく他の問題。


ワンライナー:

ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
<ブロック引用>

grep を使用して、\d.txt (IE 1 桁、次にピリオド、次に文字 txt) を含む行のみを一致させるにはどうすればよいですか?

grep -E '^[0-9]\.txt$'

試してみてください:

for a in [0-9]*.txt; do
    mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done

ファイル名のパターンを変更します ([0-9]*.txt ) 必要に応じて。

ファイル名の初期セットに関する仮定を行わない、汎用の列挙型の名前変更:

X=1;
for i in *.txt; do
  mv $i $(printf %04d.%s ${X%.*} ${i##*.})
  let X="$X+1"
done

同じトピックについて:

  • ファイル名を埋め込む Bash スクリプト
  • bash でファイル名と拡張子を抽出

for a in *.txt; do
  b=$(printf %04d.txt ${a%.txt})
  if [ $a != $b ]; then
    mv $a $b
  fi
done

Linux
  1. Linuxでテキストファイルに行番号を追加する方法

  2. Linuxシェルスクリプトを使用してパターンが一致した後、ファイルに複数行のデータを挿入します

  3. シェルスクリプトで一時ファイルを作成するにはどうすればよいですか?

  1. Linuxでファイルの名前を変更するにはどうすればよいですか?

  2. Linux - ファイル名のスペースの置き換え

  3. C で Linux 上のファイルを移動する

  1. Linuxターミナルでファイルの名前を変更します

  2. Linuxでシェルスクリプトを実行しようとすると、バイナリファイルを実行できません

  3. .sh ファイルがマルウェアになる可能性はありますか?