디렉토리를 제외한 파일을 반복합니다.

디렉토리를 제외한 파일을 반복합니다.

현재 디렉터리(하위 디렉터리 제외)의 모든 파일에 대해 특정 작업을 수행하려면 스크립트가 필요합니다.

예를 들어 현재 경로에 5개의 파일이 있는데 그 중 1개가 폴더(하위 디렉터리)입니다. 내 스크립트는 해당 스크립트를 실행할 때 인수로 제공된 명령을 활성화해야 합니다. 즉, "bash script wc -w"는 현재 디렉터리에 있는 각 파일의 단어 수를 제공해야 하지만 폴더에 대해서는 제공하지 않아야 합니다. 따라서 출력에는 "/sub/dir: is a 디렉터리" 줄이 포함되지 않습니다.

내 현재 스크립트:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

루프된 디렉터리를 제외해야 하는데 방법을 모르겠습니다.

답변1

#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

또한 심볼릭 링크 유형의 파일과 심볼릭 링크가 디렉토리 유형(아마도 원하는 것일 수 있음)으로 확인되는 파일은 제외됩니다.

대안(댓글에서)은 파일을 확인하세요.

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

답변2

수행해야 할 작업이 간단하고(메인 쉘 &c에서 변수를 설정하지 않는 경우) for 루프에 대한 대안이 있습니다.

하위 디렉터리로의 반복을 방지하기 위해 findwith -exec및 사용을 사용할 수 있습니다 .-maxdepth 1

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

이는 [ -n "$1" ]스크립트에 인수가 전달되지 않을 때 디렉터리의 모든 파일이 실행되는 것을 방지하기 위한 것입니다.

답변3

zsh에서는 사용할 수 있습니다글로벌 예선파일 유형별로 와일드카드 일치를 제한합니다. 예를 들어 (.)패턴 뒤에 추가하면 일반 파일로 제한됩니다.

wc -w *(.)

-또는 로 시작하는 파일 이름을 처리하려면 또는 을 .사용하십시오 . 일반 파일에 대한 심볼릭 링크도 포함하려면 이 파일을 .wc -c -- *(.N)wc -c ./*(.N)*(-.)

다른 일반적인 쉘에는 이러한 기능이 없으므로 파일별로 필터링하려면 다른 메커니즘을 사용해야 합니다.루프 테스트 파일 유형또는find.

답변4

Bash for 루프는 하위 디렉터리('/')와 링크(@)를 제외합니다.

for f in `ls|egrep -v '/|@'`; do echo $f; done

관련 정보