2017-01-12 5 views
2

내 상위 폴더 안에 스크립트와 여러 폴더가 있습니다. 이 폴더 안에는 임의로 이름이 지정된 텍스트 파일이 들어 있습니다. 파일 이름을 바꾸기 위해 스크립트를 실행할 때 새롭게 이름이 바뀐 파일은 상위 폴더로 끝납니다. 새로 명명 된 파일이 원래 폴더에 남아 있도록 스크립트를 작성하려면 어떻게합니까?동일한 위치를 유지하면서 하위 디렉토리의 모든 파일 이름 바꾸기

for file in $(find . -type f -name '*txt') ; do 
    name=$(parse text for correct name) 
    mv "$file" "${name}.txt" 
done 
+1

(line되는 원래의 파일 이름으로 읽기) : http://mywiki.wooledge.org/ParsingLs – muru

답변

1

mv 명령에서 디렉토리를 지정하지 않는 문제입니다. 스크립트는 상위 디렉토리에서 호출되기 때문에 이름이 바뀐 파일이 거기에 있습니다.

그 개정이 방법 :

for file in $(find . -type f -name '*txt'); do 
    # grab the directory of the file being renamed 
    dir=$(dirname "$file") 
    name=$(parse text for correct name) 
    mv "$file" "$dir/${name}.txt" 
done 

이 제안에 따라, 당신은 루프이 방법을 다시 작성할 수 있습니다.

while read -r file; do 
    dir=$(dirname "$file") 
    name=$(parse text for correct name) 
    mv "$file" "$dir/${name}.txt" 
done < <(find . -type f -name '*txt') 
2

당신의 가장 큰 도전은 단순히 그래서 당신은 path/name.txt에 원본 파일을 이동할 수 시킴으로 빨리 filename에서 path 분리되어있는 경우에, 파일 이름에 공백 및 globs의에서 당신을 보호 할 것입니다.매개 변수 확장/하위 문자열 제거를 사용하여 작업을 완료 할 수 있습니다 (예 : 파일을 임의로라는 이름의 경우`$ (찾기)에서 f를 위해`하지 않는다,

while read -r line; do 
    name=$(parse text for correct name) # parse your new name as needed 
    fname="${line##*/}"     # isolate the filename in line 
    dname="${line%"$fname"}"    # remove fname from end of line for path 
    mv "$line" "${dname}/${name}.txt" 
done < <(find . -type f -name '*txt') 
관련 문제