하위 디렉토리를 제외한 현재 디렉토리의 모든 파일에 무언가를 수행하려면 스크립트가 필요합니다.
예를 들어, 현재 경로에는 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