현재 디렉터리(하위 디렉터리 제외)의 모든 파일에 대해 특정 작업을 수행하려면 스크립트가 필요합니다.
예를 들어 현재 경로에 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 루프에 대한 대안이 있습니다.
하위 디렉터리로의 반복을 방지하기 위해 find
with -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