디렉토리를 제외한 파일을 반복


11

하위 디렉토리를 제외한 현재 디렉토리의 모든 파일에 무언가를 수행하려면 스크립트가 필요합니다.

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

내 현재 스크립트 :

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

루프의 디렉토리를 제외해야하지만 어떻게 해야할지 모르겠습니다.

답변:


11
#!/bin/bash -

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

또한 symlink 유형의 파일과 symlink가 directory 유형의 파일 (아마도 원하는 파일)로 해석되는 파일은 제외합니다.

대안 (의견에서) 파일 만 확인하십시오.

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

@roaima 좋은 생각이야!
laktak

2
사용하는 것이 좋습니다 if [ -f "$file" ]; then .... 디렉토리는 일반 파일뿐만 아니라 소켓과 심볼릭 링크도 반환합니다.
JR 퍼거슨

OP의 질문에 따라 @JRFerguson 나는 소켓과 파이프를 포함하는 것이 정말 나쁜 생각이라고 말할 것입니다. 심볼릭 링크는 ! -d이미 암시 적으로 포함되어 있습니다 .
roaima

마지막 스크립트에서 [-f $ file]을 사용했습니다. if 조건에 따옴표가 없습니다. 거의 모든 곳에서 $ 파일 주위에 따옴표가 있었지만 스크립트가 작동하려면 따옴표를 삭제해야했습니다.
Tõnis Piip

3

간단한 루프가 필요한 경우 for 루프를 사용하는 대안이 있습니다 (기본 쉘 & c에서 변수 설정을 포함하지 않음).

당신이 사용할 수 find-exec사용할 -maxdepth 1하위 디렉토리로 재귀 피하기 위해.

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

[ -n "$1" ]스크립트가 인수를 전달하지 않는 경우 디렉토리에있는 모든 파일을 실행이되지 않도록하는 것입니다.


2

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

wc -w *(.)

파일 이름으로 시작에 대처하기 위해 -또는 .사용 wc -c -- *(.N)하거나 wc -c ./*(.N). 일반 파일에 대한 심볼릭 링크를 포함하려면 그렇게하십시오 *(-.).

다른 공통 쉘에는 그러한 기능이 없으므로 루프 또는 파일 형식 테스트 와 같이 파일을 필터링하기 위해 다른 메커니즘을 사용해야 find합니다.


0

하위 디렉토리 ( '/') 및 링크 (@)를 제외한 배쉬 for 루프 :

for f in `ls|egrep -v '/|@'`; do echo $f; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.