2017-04-20 8 views
0

나는 현재 사용자가 읽을 수없는 파일을 찾기 위해 아래에 몇 가지 코드를 작성했습니다. 읽을 수없는 것으로보고 한 파일 중 하나에 대해 루프 외부의 스크립트 맨 아래에서 명시 적으로 테스트 했더라도 파일이 상위 폴더의 하위 디렉터리에서 읽을 수 없다는 메시지를 전합니다. 그러나, 나는 모든 파일을 읽을 수 있도록 설정된 그룹 권한을 갖고 있으며 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 
============ 
+0

그냥'의 LS를 추가 - $ {files [$ i]}'입력을 디버깅 하시겠습니까? 또한 typcial unix/linux cmd-line 옵션은'-r'과 같은 것을 기대합니다. 그런 다음''* ''을 인용 할 필요가 없으며 cmd 라인이 자연스럽게 처리 할 파일 목록을 확장하게하십시오. 또한'ls -l $ 1'의 결과물에는 "부모 폴더의 하위 디렉토리에있는 파일 ....."이 포함되어 있다고 생각합니다. 그렇다고 생각하지 않습니다. 어쩌면 나는 오해하고있다. 문제를 테스트 할 수있는 1 개의 파일로 1 개의 하위 디렉토리가있는 작은 4 개의 파일 샘플을 만든 경우 더 좋을 것입니다. 행운을 빕니다. – shellter

+0

for 루프에서 입력을 디버깅하기 위해'echo "$ i : $ {files [$ i]}"'를 사용하면 서브 디렉토리의 파일들이 서브 디렉토리 경로없이 어레이에 입력된다는 것을 ULick이 보여 주므로 파일 테스트가 완료되면 잘못된 위치에서 파일을 찾습니다. 별표가 인용되지 않을 때, 쉘은 그것을 스크립트로 보내기 전에 확장하여'-r'이 마지막 인수 (즉 인수 $ 213)임을 의미합니다. 아마도 당신이 주문이 전형적인 것이 아니므로, 그것을 방지하기 위해 논쟁의 순서를 전환 할 수 있습니다. –

+0

'ls -l'은 파일 인수가'*'일 때 서브 디렉토리를 나열합니다. 패턴 (예 :'.sh ') 또는 모든 파일을 검색 할 수 있도록 스크립트를 유연하게 만들고 싶기 때문에'ls -l $ 1' 인수를 입력해야했습니다. 그러나 이것은 모든 파일을 검색하기 위해 모든 파일을 잡을 인수에 무언가를 할당해야한다는 것을 의미합니다. 불행하게도 이것은'ls'에게 하위 디렉토리를 나열하도록 알려줍니다. –

답변

2

배열이이 작업을 수행 할 필요가 없습니다. 어쨌든 최선의 방법은 아니지만 ls을 사용하여 파일 목록을 반복하십시오. 자세한 내용은 http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29을 참조하십시오.

ls -1 *을 사용하면 실제 디렉토리에있는 파일 목록을 얻을 수 있습니다. 서브 디렉토리에는 ':'와 서브 디렉토리에있는 파일이옵니다. 하위 디렉토리의 파일은 실제 디렉토리 (테스트를 수행하는 곳)에 없기 때문에 읽을 수없는 것으로보고됩니다.

쉘 확장을 돌볼하고 목록을 반복하자 : 당신은 그냥 읽을 수 없습니다 파일이 필요하면

#!/bin/ksh 
for file in $1; do 
    if [ ! $2 $file ] ; then 
     echo "$file not $2" 
    fi 
done 

, 이것은 할 것 :

find .. ! -perm /u=r -print 
+0

스크립트 작동을위한 팁에 감사드립니다. 나는 실제로 find를 사용하여 권한을 테스트 할 수있는 능력을 얻었지만, 필자는이 스크립트를 작성한 내 오해가 어디인지 알고 싶었 기 때문에'find '를 사용하라고 말하지 않았기 때문에 기쁩니다. 파일을 반복 할 때 중요한 몇 가지 사항을 강조했으며 제안한 링크는 매우 유용합니다. 고맙습니다! –