web-dev-qa-db-ja.com

1_ 2_のような昇順の数字をファイル名の先頭に追加するにはどうすればよいですか?

1つのディレクトリ内のファイルに番号を追加するにはどうすればよいですか?

1つのディレクトリには、次のようなファイルがあります。

fileA
fileB
fileC
fileD

次のように、昇順の番号を追加します。

1_fileA
2_fileB
3_fileC
4_fileD

前もって感謝します。

6
paweljvn

解決策の1つ:

cd <your dir>次にbashで実行します(コマンドラインでコピーして貼り付けます):

n=1; for f in *; do mv "$f" "$((n++))_$f"; done

Bashスクリプトケース:

#!/bin/bash
n=1
for f in *
do
  if [ "$f" = "rename.sh" ]
  then
    continue
  fi
  mv "$f" "$((n++))_$f"
done

rename.shとして名前を付けて、名前を変更するファイルを含むディレクトリに保存し、chmod +x rename.shを実行してから./rename.shを実行します

8
mature

9個以上のファイルがある場合、printfを使用して番号をパディングし、次のように予想されるソート順を取得します

n=0
for f in *
    do printf -v new "%2d$((++n))_$f"
    echo mv -v -- "$f" "$new"
done

正しい結果が表示されたら、echoを削除します。

説明

この行では、do printf -v new "%2d$((++n))_$f"新しいファイル名のフォーマットを作成し、それを変数newに入れます。

%2dは2桁の10進数です。 2dの代わりに、3dなどを使用して、先頭の別の0を取得できます(99を超えるファイルがある場合)。

((++n))は、変数n(スクリプトの開始時に0に設定します)をインクリメントします。ループが実行されるたびに1回繰り返されるため、ファイルには名前のプレフィックスが追加されます。

-vは、変更される内容をmvに出力します。

mvステートメントの--は、-で始まるファイル名がオプションとして解釈されるのを防ぐためのものです。

7
Zanna

file-renameの仕事です Install file-rename (別名Perlの名前変更):

file-rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *

これは変数を定義し、設定されていない場合は増加し(そうでない場合は0の代わりに1で始まる)、ファイル名の先頭を毎回増加する番号に置き換えます。形式は簡単に変更できます。 3桁(001002、…)にするには、"%03d_"を使用します。 -nを指定して実行すると、変更のみが出力され、実際に名前を変更してこのフラグを削除します。

実行例

代替システムを使用すると、renameは私のシステムのfile-renameにリンクされます。

$ ls -1
fileA
fileB
fileC
fileD
$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(fileA, 1_fileA)
rename(fileB, 2_fileB)
rename(fileC, 3_fileC)
rename(fileD, 4_fileD)
$ rename 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
$ ls -1
1_fileA
2_fileB
3_fileC
4_fileD
6
dessert
  1. Nautilusでディレクトリを開きます。

  2. すべてのファイルを強調表示します。

  3. 右クリックして、コンテキストメニューから[名前の変更...]を選択します。

  4. [名前の変更]ダイアログで、 +Add ボタン。

  5. 「自動番号」の下の「1,2,3,4」を選択します

  6. 次に、[名前の変更]ダイアログのテキスト入力フィールドで、「[1、2、3]」と「[元のファイル名]」の間にアンダースコア「_」文字を挿入します。

    「[1、2、3] _ [元のファイル名]」のようになります

  7. クリック Rename ボタン。

Select "1,2,3,4" in the Rename dialog

The renamed files

6
PJ Singh

1つのオプションは

cd /path/to/folder/
ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
  • 改行「\ n」のあるファイル名を除き、これは正常に機能します。スイッチ「-1v」はスペースとタブを処理し、

  • ここに投稿された他のコマンドは、数字の付いたファイルの順序を変更します。 10aは1aの前に来ます。

  • 状況に合った方。

これらすべてのコマンドをテストする時間がありました。結果は次のとおりです。

$ ls
001abc.txt  '10a bc.txt'   1abc.txt  '2ab c.txt'  'a'$'\t''bc.txt'

$ ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
Reading filenames from file handle (GLOB(0x55cb57991b28))
rename(001abc.txt, 01_001abc.txt)
rename(1abc.txt, 02_1abc.txt)
rename(2ab c.txt, 03_2ab c.txt)
rename(10a bc.txt, 04_10a bc.txt)
rename(a    bc.txt, 05_a    bc.txt)

$ n=1; for f in *; do echo mv "$f" "$((n++))_$f"; done
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a    bc.txt 5_a  bc.txt

$ for f in *;     do printf -v new "%2d$((++n))_$f";     echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt  09_001abc.txt
mv -v -- 10a bc.txt  010_10a bc.txt
mv -v -- 1abc.txt  011_1abc.txt
mv -v -- 2ab c.txt  012_2ab c.txt
mv -v -- a  bc.txt  013_a   bc.txt

$ ./rename.sh 
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a    bc.txt 5_a  bc.txt

$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(001abc.txt, 1_001abc.txt)
rename(10a bc.txt, 2_10a bc.txt)
rename(1abc.txt, 3_1abc.txt)
rename(2ab c.txt, 4_2ab c.txt)
rename(a    bc.txt, 5_a bc.txt)
rename(rename.sh, 6_rename.sh)

$ for f in *;     do printf -v new "%2d$((++n))_$f";     echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt  01_001abc.txt
mv -v -- 10a bc.txt  02_10a bc.txt
mv -v -- 1abc.txt  03_1abc.txt
mv -v -- 2ab c.txt  04_2ab c.txt
mv -v -- a  bc.txt  05_a    bc.txt
mv -v -- rename.sh  06_rename.sh
1
Vijay