2013-08-21 5 views
1
#!/bin/bash 
#script to loop through directories to merge files 

mydir=/data/ 
files="/data/*" 

for f in $files 
do 
    if[ -d "$f" ] 
    then 
      for ff in $f/* 
      do 
        echo "Processing $ff" 
      done 
    else 
      echo "Processing $f" 
    fi 
done 

위의 코드를 통해 디렉터리와 하위 디렉터리를 탐색하고 모든 파일을 나열 할 수 있습니다. 예기치 않은 토큰 근처에서 구문 오류가 발생합니다. '디렉터리 및 하위 디렉터리를 통해 파일을 목록으로 이동하는 스크립트

여기서 내가 뭘 잘못하고 있니?

답변

5
if [ -d "$f" ] 
^

if[ 사이에 공백이있을 필요가있다. 공백이 없다면 bash는 if[이라는 명령을 실행하려고한다고 생각합니다.


files="/data/*" 
for f in $files 

또한이 작동하지 않습니다 것을 알고있다. 배열과 같은 변수에 와일드 카드 확장을 저장합니다. 문법은 약간 털이 있습니다 ...

files=(/data/*) 
for f in "${files[@]}" 

또는 내부 루프를 사용하는 방식으로 와일드 카드를 작성할 수 있습니다. 그것은 잘 작동합니다.


그것은 가치가 무엇인지, 당신이 재귀 적으로 모든 파일과 하위 디렉토리를 재귀 할 find를 사용할 수있는 경우

for f in "$mydir"/* 
.

find /data/ -type f -print0 | while read -d $'\0' file; do 
    echo "Processing $file" 
done 

-type f은 파일과 일치합니다. -print0-d $'\0'과 결합하면 공백, 탭 및 줄 바꿈과 같은 문자가 포함 된 파일 이름에 특히주의해야합니다. 파일 이름에 이러한 문자가 포함되어 있으므로 스크립트를 처리 할 수있는 방식으로 스크립트를 작성하고 싶습니다.

이 작업은 하위 디렉터리보다 더 중요합니다. 끝까지 내려갈거야. 원하는 내용이 아닌 경우 -maxdepth 2을 추가하십시오.

대안으로
+1

감사합니다. 그게 효과가 있었어! –

3

, 당신은 아마 여기에 당신이 폴더 "/ 폴더"바닥 func_process_folder_set에 전화를 참조를 통과, 무엇을 물어 않는 함수의

# find all files either in /data or /data/subdir 
find /data -type f -maxdepth 2 | while read file; do 
    echo $file; 
end 
+0

파일 이름을 나열하여 코드를 테스트하기 때문에 루프를 사용하고 있습니다. 하위 디렉토리로 이동하여 파일을 병합 한 다음 다른 하위 디렉토리로 다시 이동하고 파일을 다시 병합하는 등 다른 처리를해야합니다. 의견을 보내 주셔서 감사합니다! –

+0

문제 없습니다. 단지 당신이 알고 있는지 확인하고 싶었습니다! –

+0

내 프로그램에서 파일을 동적으로 생성합니다. 동적으로 할당하는 방법이 있습니까? 그들의 이름이 내 디렉토리 이름과 일치하도록하고 싶습니다. –

0

같은 것을이 전체 루프를 대체 할 수 .

# --- -------------------------------- --- # 
    # FUNC: Process a folder of files 
    # --- -------------------------------- --- # 
    func_process_folder_set(){ 

     FOLDER="${1}" 

     while read -rd $'\0' file; do 

      fileext=${file##*.} # -- get the .ext of file 
      case ${fileext,,} # -- make ext lowercase for checking in case statement 
      echo "FILE: $file" # -- print the file (always use " " to handle file spaces) 

     done < <(find ${FOLDER} -type f -maxdepth 20 -name '*.*' -print0) 

    } 

    # -- call the function above with this: 
    func_process_folder_set "/some/folder"