3

コマンド行から名前を変更する必要のある画像ファイルが多数あります。これを行う最善の方法はawkを使用することだと思います(これが正しくない場合は修正してください)。

ファイル名は以下のようになります

1038282829128738912-1.jpg

すべての画像ファイルは「103」で始まり、ファイル名のこの部分を「201003」に置き換えたいのですが、残りはそのままにしておきます...例:

2010038282829128738912-1.jpg

画像は1つのメインフォルダ(images)の下にある複数のフォルダにありますが、すべての画像を1つのフォルダ(images_renamed)にコピーすると便利です。

これをどこから始めればよいのかわかりません。awkの使用法をグーグルで検索しましたが、ファイル内のテキストの名前変更の例しか見つかりません。

助けていただければ幸いです。ありがとう/

4

6 に答える 6

7

UNIX にコマンドがある場合は、次のrenameようなものを使用できるはずです。

mkdir images_renamed
cd images_renamed
cp ../103*.jpg .
rename 103 201003 *.jpg

rename FROM TO FILEは、 で指定されたすべてのファイルの名前を変更FILEし、最初に出現する を に変更FROMTOます。

それが利用できない場合は、次のようなものを使用できます。

mkdir images_renamed
for fspec in 103*.jpg ; do
    cp ${fspec} images_renamed/201003${fspec:3}
done

これを再帰的に行うには、次のようにスクリプトに入れますfind

#!/usr/bin/bash

rm -rf images_renamed
ls -lR images
echo

cd images
find . -name '*.jpg' | while read -r; do
    mkdir -p "../images_renamed/$(dirname "$REPLY")"
    echo 'Copying from' [$REPLY]
    echo '          to' [../images_renamed/$REPLY] and renaming.
    echo
    cp "$REPLY" "../images_renamed/$REPLY"
    cd "$(dirname "../images_renamed/$REPLY")"
    rename 103 201003 "$(basename "$REPLY")"
    cd - >/dev/null
done

cd ..
ls -lR images_renamed

その中間部分だけが必要で、残りはテスト用です。以下の出力は、すべてのファイルを新しいディレクトリ構造にコピーし、関連するファイルの名前を変更する方法を示しています。

images:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir1
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir2
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:56 dir3

images/dir1:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 102xxx.jpg
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 103xxx.jpg

images/dir2:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 103yyy.jpg

images/dir3:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 20:55 dir 4

images/dir3/dir 4:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 20:55 103zzz.jpg

Copying from [./dir1/102xxx.jpg]
          to [../images_renamed/./dir1/102xxx.jpg] and renaming.

Copying from [./dir1/103xxx.jpg]
          to [../images_renamed/./dir1/103xxx.jpg] and renaming.

Copying from [./dir2/103yyy.jpg]
          to [../images_renamed/./dir2/103yyy.jpg] and renaming.

Copying from [./dir3/dir 4/103zzz.jpg]
          to [../images_renamed/./dir3/dir 4/103zzz.jpg] and renaming.

images_renamed:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir1
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir2
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir3

images_renamed/dir1:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 102xxx.jpg
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003xxx.jpg

images_renamed/dir2:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003yyy.jpg

images_renamed/dir3:
total 0
drwxr-xr-x+ 1 pax None 0 2010-08-12 21:19 dir 4

images_renamed/dir3/dir 4:
total 0
-rw-r--r-- 1 pax None 0 2010-08-12 21:19 201003zzz.jpg

ファイル階層をフラット化するには、次のようなものを使用できます。

#!/usr/bin/bash

rm -rf images_renamed
ls -lR images
echo

cd images
mkdir -p ../images_renamed
find . -name '*.jpg' | while read -r; do
    newfile="$(basename "$REPLY")"
    echo 'Copying from' [$REPLY]
    echo '          to' [../images_renamed/$newfile] and renaming.
    echo
    cp "$REPLY" "../images_renamed/$newfile"
    cd ../images_renamed
    rename 103 201003 "$newfile"
    cd - >/dev/null
done

出力:

cd ..
ls -lR images_renamed
images:
total 0
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir1
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir2
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:56 dir3

images/dir1:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 102xxx.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 103xxx.jpg

images/dir2:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 103yyy.jpg

images/dir3:
total 0
drwxr-xr-x+ 1 allan None 0 2010-08-12 20:55 dir 4

images/dir3/dir 4:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 20:55 103zzz.jpg

Copying from [./dir1/102xxx.jpg]
          to [../images_renamed/102xxx.jpg] and renaming.

Copying from [./dir1/103xxx.jpg]
          to [../images_renamed/103xxx.jpg] and renaming.

Copying from [./dir2/103yyy.jpg]
          to [../images_renamed/103yyy.jpg] and renaming.

Copying from [./dir3/dir 4/103zzz.jpg]
          to [../images_renamed/103zzz.jpg] and renaming.

images_renamed:
total 0
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 102xxx.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003xxx.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003yyy.jpg
-rw-r--r-- 1 allan None 0 2010-08-12 22:41 201003zzz.jpg

ただし、ファイル名の衝突 (異なるディレクトリにある同じファイル名) は互いに上書きされることに注意する必要があります。

于 2010-08-12T12:44:39.387 に答える
0

以下が機能するはずです。

ls -d images*
images/          images_renamed/


for i in `find images -type f`
do
  cp $i images_renamed/$(basename $i | sed s/^103/201003/)
done
于 2010-08-12T13:04:27.420 に答える
0
find /path -type f -name "10*jpg" | sed 's/.*/mv &/' | sed 's/mv \(.*\/\)\(.[^/]*\)/& \120\2/' | sh
于 2010-08-12T13:04:32.670 に答える
0

ZSHではこれを行うことができます(おそらくBashでも動作しますが、これについてはわかりません):

for f in **/103*.jpg; mv $f some_other_directory/201003${${f:t}#103}

たぶん、私が書いたツールにも興味があるかもしれません: http://github.com/jkramer/virn Vim を使って、正規表現などのすべての Vims 機能を含むファイルの名前を一括変更できます (実際には、他の $EDITOR も同様)。

于 2010-08-12T12:47:24.067 に答える
0

このようなものが役立ちます:

cd images
find . -name '*.jpg' | while read -r img; do
    mkdir -p "../images_renamed/$(dirname "$img")"
    cp -v "$img" "../images_renamed/$(echo "$img" | sed -e 's/^103/201003/')"
done

注: テストされていません。ただし、物を削除しないでください。

于 2010-08-12T12:48:03.410 に答える
-1

テストしていませんが、このようなものがbashで機能する可能性があります:

for i in `ls 103*.jpg`; do cp $i newdir/201003${i:3}; done
于 2010-08-12T12:46:01.230 に答える