디렉토리를 제외한 파일을 반복 때 인수로 제공된 명령을 활성화해야합니다. 즉,

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

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

내 현재 스크립트 :

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

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



답변

#!/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

답변

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

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

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

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


답변

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

wc -w *(.)

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

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


답변

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

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