CSV 파일을 기반으로 파일 (이미지)의 일괄 이름 바꾸기 방법


11

내가 가지고 있고 달성하고자하는 것 :

  1. 한 폴더에 수천 개의 이미지가 있습니다.

  2. 다음과 같은 열이있는 CSV 파일이 있습니다.

    A : 원래 이름 B : 이름이 바뀐 이름

    일반적인 행은 다음과 같습니다.

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    따옴표를 제거 할 수 있습니다. 문제는 아닙니다.

  3. 이제 앱을 사용하거나 A 열의 모든 이미지를 검색하고 B 열의 이름으로 이름을 바꾸는 스크립트를 실행하고 싶습니다 (예 : original-1.jpg-> renamed-1.jpg).

주위에 몇 가지 답변이 있습니다.

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

그러나 일부 스크립팅이 관련되어 있으며 해당 스크립트가 모두 스크립트를 저장 한 폴더에만 영향을 주거나 특정 조건을 만족하는 디스크의 모든 파일 이름을 바꿀 수 있는지 확실하지 않습니다. 물론 후자는 피해야합니다.

내가 찾고있는 것은 파일 이름을 바꾸는 방법과 파일이있는 폴더를 선택하는 방법에 대한 간단한 안내서입니다.

미리 감사드립니다.

답변:


13

이것은 당신을 위해 작동합니다 :

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

설명:

  • sed 's/"//g' files.csv : 따옴표를 제거
  • IFS=, : 입력을 분할 ,
  • while read orig new; do ... done: 이것은 각 입력 줄을 읽고 $IFS(여기서는 쉼표) 값으로 나누고 첫 번째 필드는로 저장 $orig하고 나머지는 로 저장합니다 $new.
  • mv "$orig" "$new" : 요청에 따라 파일 이름이 바뀝니다.

파일에 파일 이름 (예 :) 만 orig.jpg있고 경로가 /home/take2/orig.jpg없거나 (유사 하지 않은 ) 위의 명령은 현재 디렉토리의 파일에만 영향을줍니다. 따라서 터미널 cd을 대상 디렉토리 로 열어서 실행해야합니다.

먼저 테스트 :

이를 테스트하기 위해 실제로 실행하지 않고 실행될 명령을 인쇄하여 먼저 드라 이런을 수행 할 수 있습니다.

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 

잘 설명되어 있습니다. :) 실행하기 전에 확인하기 만하면됩니다. 대상 디렉토리로 cd하여이 행을 실행해야합니까 아니면 해당 행을 example.sh로 저장 한 다음 터미널에서 "example.sh"를 실행해야합니까?
take2

@ take2 당신은 라인을 직접 실행할 수 있습니다. 실제로 파일을 변경하지 않고 실행되는 것을 볼 수있는 방법으로 답변을 업데이트했습니다. 먼저 그렇게하는 것이 좋습니다.
terdon

훌륭합니다! 한 가지 더 – 열의 레이블이 무엇인지 (지금은 "orig"및 "new") 상관하지 않습니까? 아니면 열 A 이름을 열 B 이름으로 바꾸나요?
take2

@ take2 어떤 라벨? 아니요, 쉼표로 구분 된 첫 번째 필드 만 사용하고 두 번째 필드로 이름을 바꿉니다. 두 개 이상의 필드가 있으면 나머지 줄로 이름이 바뀝니다. 입력 파일이 게시 한 것과 유사하면 예상대로 작동합니다.
terdon

Btw. 터미널은 파일 이름을 변경했지만 "mv : stat 'orig': no ​​such file or directory"도 표시합니다.
15 분 13 초에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.