2016-10-19 2 views
0

열거 된 방식으로 명명 된 몇 개의 파일의 이름을 바꾸려고합니다. 이전의 접근 방식은이 명령 줄을 사용하는 것이 었습니다.스크립트 내에서 ls를 실행할 때의 다른 동작

FILES=`ls "someDir/"`; for f in $FILES; do echo "Processing file: $f"; done; 

Echoing 파일 이름은 데모 용입니다.

SCRIPT: 
#!/bin/bash 
FILES=`ls "someDir/"` 

for f in $FILES 
do 
    echo "Processing file: $f" 
done 

OUTPUT: 
Processing file: File1 
File2 
File3 
... 
: 나는 (내가 생각하는 것은 같은 일입니다) 아래 스크립트, 그것은 하나 개의 파일로 전체 ls 출력을 취급하고이 출력을 생성 실행할 때

Processing file: File1 
Processing file: File2 
Processing file: File3 
... 

: 위는 예상 출력을 생성

나는 그 머리를 감당할 수 없다. 또한 나는 심지어이 동작을 생산하고있다 ls인지 확실하지 않습니다. 이 문제의 원인은 무엇입니까? 그리고 왜?

답변

2

Why you shouldn't parse the output of ls(1)을 참조하고 명령 출력을 처리하려면 process-substitution을 사용하십시오.

#!/bin/bash 

while IFS= read -r -d '' file; do 
    echo "$file" 
    # Do whatever you want to do with your file here 
done < <(find someDir/ -maxdepth 1 -mindepth 1 -type f -print0 | sort -z) 

위의 간단한 find 목록 (공간/특수 문자를 포함한) 필요한 디렉토리에서 모든 파일. 여기서, find 커맨드의 출력은 while-loop에 의해 해석되는 stdin에 공급된다.

파일을 정렬하려면 sort -zfind 명령 출력에 추가하십시오.

+0

파일의 실제 순서를 유지하기 위해'find'라고 말하는 방법이 있습니까? 이름이 붙여진 순서대로 처리해야하기 때문에 먼저'File1', 그리고 나서'File2' 등으로 처리합니다. 그러나'find '는'File325','File3','File20', ...과 같은 명령 출력을 생성합니다. – muXXmit2X

관련 문제