2010-08-12 4 views
2

커맨드 라인에서 이름을 바꾸어야하는 이미지 파일이 많습니다. 최선의 방법은 awk를 사용하는 것입니다 (올바르지 않은 경우 수정하십시오).UNIX를 사용하여 일괄 파일 이름 바꾸기 - awk를 사용해야합니까?

파일 이름은 모든 이미지 파일은 '103'로 시작하는 다음

1038282829128738912-1.jpg 

처럼 나는 '201003'로 파일 이름의이 부분을 대체 할 - 예를 들면 ... 나머지는 그대로두고.

2010038282829128738912-1.jpg 

이미지

은 하나의 주 폴더 아래에 여러 폴더에 (이미지)입니다 -하지만 난 곳으로 모르는 모든 이미지 (images_renamed) 하나 개의 폴더

에 복사하는 것이 편리 할 것 이것으로 시작하십시오 - 그리고 awk 사용법에 대한 검색 좀하지만 파일 안에 텍스트의 이름 바꾸기 예제를 찾을 수 있습니다.

도움을 주시면 감사하겠습니다. 당신이 당신의 UNIX에 rename 명령이있는 경우 감사/

+0

펄'rename' 스크립트는 솜씨이 작업을 수행합니다. 사실 Perl을 작성하려는 동기 중의 하나는 awk가 많은 파일을 제한적으로 지원한다는 것입니다. 'rename'은 이미 debian 기반 배포판이나 http://search.cpan.org/~rmbarker/File-Rename-0.05/ – msw

+0

의 일부가되어야합니다. 모든 답변을 주셔서 감사합니다. 이것들 중. 나중에 다시 돌아와서 질문에 답을 표시 할 것입니다. 여기에 정확한 답이 있어야합니다 :-) 다시 한 번 감사드립니다. – calumbrodie

+0

여기를 확인하십시오 : http : //theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html – Vijay

답변

6

, 당신은 같은 것을 사용 할 수 있어야한다 :

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

rename FROM TO FILEFROM의 첫 번째 발생에 변화 FILE에 의해 지정된 모든 파일을 이름을 변경합니다 TO. 내가 find와 스크립트에 넣어 것

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

재귀 적으로이 작업을 수행하려면 :

#!/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 

를 그 만 중간 비트 즉 사용할 수없는 경우

, 당신은 같은 것을 사용할 수 있습니다 나머지는 테스트 용입니다. 아래 출력은 모든 파일을 새로운 디렉토리 구조로 복사하고 관련 파일의 이름을 변경하는 방법을 보여줍니다. (

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 

을하지만 당신은 충돌을 파일 이름을 명심해야합니다 출력

#!/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 

:

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 

파일 계층 구조를 평평하게하기 위해, 당신은 같은 것을 사용할 수 있습니다 다른 디렉토리에있는 동일한 파일 이름)이 서로 덮어 씁니다.

+0

이 작업이 재귀 적으로 작동합니까? – scy

+0

아니요, 주위를 감싸고 있어야합니다. 한 가지 방법으로 업데이트되었습니다. – paxdiablo

+0

답변 해 주셔서 감사합니다. 내가 바꾸고 싶은 유일한 것은 목적지입니다. 파일을 복사 한 디렉토리 구조를 유지하는 대신 모든 이미지를 'images_renamed'폴더에 복사합니다. 내가 제공 한 스크립트를 변경하려고했지만 성공하지 못했습니다. $ REPLY와 dirname, basename 등의 관계는 작동하지 않습니다. $ REPLY는 find 명령과 일치하는 ful 경로와 파일 이름입니다.하지만이 정보에서 파일 이름 만 추출하여 이름 바꾸기 단계에서 사용할 수 있습니까 (예 : 즉, 디렉토리가 아닌 파일 이름 만 사용) – calumbrodie

-1

은 테스트하지 않았습니다 그러나이 같은 배쉬에서 일할 수 :

for i in `ls 103*.jpg`; do cp $i newdir/201003${i:3}; done 
+0

하위 디렉토리에서는 작동하지 않습니다. – scy

+0

ls 쓸모없는 사용 – ghostdog74

0

zsh을에서 (이 확실하지, 너무 아마 배쉬에서 작동)이 작업을 수행 할 수 있습니다

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

어쩌면 나는 또한 내가 쓰는 도구에 관심을 가질 수있다 : http://github.com/jkramer/virn 정규식과 같은 모든 Vims 기능을 포함하여 Vim을 사용하여 파일의 이름을 변경할 수있다.(사실, 다른 $ EDITOR도 사용할 수 있습니다.) 이 같은

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 

참고 : 테스트하지 않습니다. 비록 사물을 삭제해서는 안됩니다.

+0

정말로 각 파일에 대한 디렉토리를 만드시겠습니까? –

+0

그건 내가하는 일이 아니야. 원본 파일 이름 (디렉토리 포함)을 가져 와서 그 디렉토리와 그 위에 가능한 디렉토리를 만듭니다. 그 행을 다시 읽고 싶을 수도 있습니다. – scy

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 
+0

파일 이름에 공백이 있으면 작동하지 않습니다. 'find | while read '와 파일 이름을 포함하는 인용 변수가 있습니다. –

+0

은 동의했지만 OP의 파일 이름 규칙에 따라 그렇게 할 필요가 없다고 생각했습니다. – dogbane

0
find /path -type f -name "10*jpg" | sed 's/.*/mv &/' | sed 's/mv \(.*\/\)\(.[^/]*\)/& \120\2/' | sh 
+0

예수. 아프다. 그러나 실제로 작동 할 수도 있습니다. – scy