2014-03-26 2 views
1

이 질문을 게시하는 과정에서 필자는 코드를 실험 해봤는데 작동하는 것을 생각해 냈지만 불안한 지성은 더 나은 프로그래머가되고 싶습니다. 바로 문제를 해결하기 위해 Script 1.0과 Script 1.1을 게시하여 커뮤니티에 문의하십시오. 3 번 줄을 변경하면 왜 효과가 있습니까?mv를 사용하여 파일 이름 앞에 접두어가 붙습니다.

서버에서 파일을 복사하고 이름을 바꿉니다. 복사가 잘되고 있습니다. 이름 바꾸기는 그렇지 않습니다. 이 파일 이름에는 공백이 있습니다. cp 그들을 유능하게 다루십시오; 것 같습니다. 문제를 해결하기 위해 변수 이름에 ""을 넣을 것을 기대했지만 여전히 오류가 있습니다 : mv: rename /src/foo.wav to zzz - /dest/foo.wav - copied 201403261800.wav: No such file or directory. 나는 파일 이름 앞에 "zzz"를 붙이려고 노력하고 있지만 대상 경로 앞에 붙어 있습니다.

cd /src/ 
DATE=$(date +"%Y%m%d%H%M") 
find . -type f -iname "*.wav" | while read file ; do 
    if [[ "$file" != *zzz* ]]; then 
     echo "Tranferring..."; 
     cp "$file" /dest/ 
     mv "$file" \zzz\ \-\ "$file"\ \-\ copied\ $DATE.wav 
     echo "Transfer complete."; 
    fi 
done 

3 라인이 작동하게 변경 (. if 조건이 내가 이전에 복사하고 이름을 변경 한 것을-복사 다시하지 않도록합니다) : 여기 스크립트 1.0입니다. 하지만 왜? 여기 스크립트 1.1의 : ./passwd : 당신이 다른 find 명령의 출력을 보면 당신이 find . -type f이 같은 라인을 반환 것을 볼 수 있습니다

cd /src/ 
DATE=$(date +"%Y%m%d%H%M") 
find *.* -iname "*.wav" | while read file ; do 
    if [[ "$file" != *zzz* ]]; then 
     echo "Tranferring..."; 
     cp "$file" /dest/ 
     mv "$file" \zzz\ \-\ "$file"\ \-\ copied\ $DATE.wav 
     echo "Transfer complete."; 
    fi 
done 

답변

2

. ./passwd에서 zzz - ./passwd으로 이름을 바꾸면 zzz - . 폴더로 이동하려고 시도하므로 passwd으로 대상으로 사용할 수 없습니다. 그런데

, 당신은 따옴표로 전체 대상의 이름을 둘러싸고 수는 (또한 당신이 어쨌든 최초의 Z 탈출 안) 더 잘 볼 수 있도록 :

또한 당신은 아마 제거 할
mv "$file" "zzz - $file - copied $DATE.wav" 

파일의 중간에 .WAV 부분 : 존재하는 경우 그것의 끝에서 제거 문자열 $ var에의

mv "$file" "zzz - ${file%.wav} - copied $DATE.wav" 

${var%string} 반환 값. bash 문자열 조작에 대한 자세한 내용을 찾을 수 있습니다.

+0

이것은 내 질문의 범위를 넘어서서 실제로 도움이되었습니다. 나는 이것을 시험해 보았고 모두 잘 작동한다. 고맙습니다. – Crowder

관련 문제