나는 현재 사용자가 읽을 수없는 파일을 찾기 위해 아래에 몇 가지 코드를 작성했습니다. 읽을 수없는 것으로보고 한 파일 중 하나에 대해 루프 외부의 스크립트 맨 아래에서 명시 적으로 테스트 했더라도 파일이 상위 폴더의 하위 디렉터리에서 읽을 수 없다는 메시지를 전합니다. 그러나, 나는 모든 파일을 읽을 수 있도록 설정된 그룹 권한을 갖고 있으며 vi를 사용하여 여러 파일을 열어 본 적이 있는지 확인했습니다. 여기서 무슨 일이 일어나고있는거야?리눅스의 조건부 파일 논리
스크립트 :
#!/bin/ksh
set -A files $(ls -1 $1)
echo "${#files[@]}"
for((i=0; $i < ${#files[@]}; i++)); do
if [ ! $2 ${files[$i]} ]; then
echo "${files[$i]} not $2"
fi
done
echo "============"
if [ ! -r ./tmp/feederseries.txt ]; then
echo "./tmp/feederseries.txt not readable"
fi
출력 :
$ testfiles.sh "*" -r
212
./buildhist: not -r
20170109_124058.txt not -r
20170109_124128.txt not -r
./cmpatches: not -r
tmp.txt not -r
./reports: not -r
archived not -r
./tmp: not -r
feederseries.txt not -r
============
그냥'의 LS를 추가 - $ {files [$ i]}'입력을 디버깅 하시겠습니까? 또한 typcial unix/linux cmd-line 옵션은'-r'과 같은 것을 기대합니다. 그런 다음''* ''을 인용 할 필요가 없으며 cmd 라인이 자연스럽게 처리 할 파일 목록을 확장하게하십시오. 또한'ls -l $ 1'의 결과물에는 "부모 폴더의 하위 디렉토리에있는 파일 ....."이 포함되어 있다고 생각합니다. 그렇다고 생각하지 않습니다. 어쩌면 나는 오해하고있다. 문제를 테스트 할 수있는 1 개의 파일로 1 개의 하위 디렉토리가있는 작은 4 개의 파일 샘플을 만든 경우 더 좋을 것입니다. 행운을 빕니다. – shellter
for 루프에서 입력을 디버깅하기 위해'echo "$ i : $ {files [$ i]}"'를 사용하면 서브 디렉토리의 파일들이 서브 디렉토리 경로없이 어레이에 입력된다는 것을 ULick이 보여 주므로 파일 테스트가 완료되면 잘못된 위치에서 파일을 찾습니다. 별표가 인용되지 않을 때, 쉘은 그것을 스크립트로 보내기 전에 확장하여'-r'이 마지막 인수 (즉 인수 $ 213)임을 의미합니다. 아마도 당신이 주문이 전형적인 것이 아니므로, 그것을 방지하기 위해 논쟁의 순서를 전환 할 수 있습니다. –
'ls -l'은 파일 인수가'*'일 때 서브 디렉토리를 나열합니다. 패턴 (예 :'.sh ') 또는 모든 파일을 검색 할 수 있도록 스크립트를 유연하게 만들고 싶기 때문에'ls -l $ 1' 인수를 입력해야했습니다. 그러나 이것은 모든 파일을 검색하기 위해 모든 파일을 잡을 인수에 무언가를 할당해야한다는 것을 의미합니다. 불행하게도 이것은'ls'에게 하위 디렉토리를 나열하도록 알려줍니다. –