私はたくさんの写真を持っています。一部はあり、.jpg
一部はです.png
。与えられた画像は完全に任意の名前を持つことができます(スペースを含めることができます)。特定のディレクトリ内で拡張子を変更せずにすべてのディレクトリの名前を変更するにはどうすればよいですか?たとえば、次のようになります。
001.jpg 02.png 05.png zzzz.jpg
0001
で始まり9999
(必要な場合)、4桁の数字で名前を完全に変更したいと思います。したがって、出力は次のようになります。
0001.jpg 0002.png 0003.png 0004.jpg
このファイルの順序は私にとって重要ですが、ファイル名で並べ替えると、すでに順に並べ替えられています。
私はPerlをチェックしてみましrename
たが、この例ではPerlの使い方は私にとって謎です。
答え1
Perlソリューション
perl -e '
@files = sort glob "*.png *.jpg";
for(@files){
($extension = $_) =~ s/.*\.(.*)/$1/;
$new_name = sprintf("%04d",++$counter).".$extension";
die "File $new_name already exists and would be clobbered\n" if -e $new_name;
rename $_ => sprintf("%04d",++$counter).".$extension"
}'
カンクンソリューション
export COUNT=0
find . -maxdepth 1 -name "*.jpg" -o -name "*.png" -print0 | xargs -0 sort | while read file do\
extension=${file##*.}\
COUNT=$((COUNT+1))\
mv -- "$file" $(printf "%04d" $COUNT).$extension\
done
ノート
どちらのソリューションもテストされていない Bash ソリューションです。まずダミーファイルで試してみてください。- ファイル名に改行文字が含まれていると、Bashソリューションがクラッシュする可能性があります。
- 危険:Gillesが以下の説明で指摘したように、元のファイルの1つの名前がターゲットの命名規則に従うと、せいぜい別の「数字」に名前が変更され、最悪の場合は他のファイルによって破損します。何が起こるかは、他のファイルに対してどのようにソートされるかによって異なります。 OPが好むようだったので、これをPerlソリューションに追加しました。
- Perlソリューション(上記の実装)は次のとおりです。非等性。
答え2
(bash
解決策)
printf
新しい名前をフォーマットし、awk
ファイル拡張子を選択するために使用されます...
$ ls
a.b c.d e.f g.h i.j k.l m.n o.p q.r s.t this file.y u.v w.x
$ COUNTER=0
$ for i in *; do COUNTER=$(($COUNTER + 1)); mv -v "$i" $(printf "%04g" $COUNTER).$(echo $i | awk -F'.' '{print $NF}'); done
`a.b' -> `0001.b'
`c.d' -> `0002.d'
`e.f' -> `0003.f'
`g.h' -> `0004.h'
`i.j' -> `0005.j'
`k.l' -> `0006.l'
`m.n' -> `0007.n'
`o.p' -> `0008.p'
`q.r' -> `0009.r'
`s.t' -> `0010.t'
`this file.y' -> `0011.y'
`u.v' -> `0012.v'
`w.x' -> `0013.x'
$i
前述のように、ファイル名のスペースをエスケープするには、入力を引用符で囲む必要があります。
答え3
存在するTxR不明な言葉:
(let ((counter 0))
(each ((name (sort (glob "*.{png,jpg}"))))
(let ((new (pic "0###<" (inc counter) (short-suffix name))))
(if (path-exists-p new)
(error `@new already exists`))
(rename-path name new))))
まず、名前変更リストを準備し、同時に正しい名前が存在することを確認するなど、他の操作を実行できます。この場合、名前の変更は行われません。
答え4
このスクリプトを保存してください。
#!/bin/bash
NUM=0
NUMBER_LENGTH=4
cd $1;
ls . -1 | sort | while read file; do
NUM=$(( $NUM + 1 ));
PREFIX=$NUM;
while [ ${#PREFIX} != $NUMBER_LENGTH ]; do
PREFIX="0${PREFIX}";
done;
NEW_NAME=$PREFIX.`echo $file | sed 's|[^.]\+\.\([\A-Za-z0-9]\+\)|\1|g'`;
mv "$file" "$NEW_NAME";
done
次のように実行します。
./_scriptname_ _dirWhereYourStuffIs_
注:スクリプト自体の名前が変更されるため、スクリプトをジョブと同じディレクトリに配置しないでください。
十分に狂った場合は、スクリプトを使用せずに1行ですべての操作を実行できます。
NUM=0; NUMBER_LENGTH=4; ls . -1 | sort | while read file; do NUM=$(( $NUM + 1 )); PREFIX=$NUM; while [ ${#PREFIX} != $NUMBER_LENGTH ]; do PREFIX="0${PREFIX}"; done; NEW_NAME=$PREFIX.`echo $file | sed 's|[^.]\+\.\([\A-Za-z0-9]\+\)|\1|g'`; mv "$file" "$NEW_NAME"; done
注#2:この行はBASHを使用していると想定しています。