2012-03-07 4 views
11

다음 명령이 있습니다. .user.log 파일이있는 곳이면 부모 디렉토리를 인쇄해야합니다 (예 : hhtwee1). 어떻게 수행 할 수 있습니까?파일 찾기 및 상위 디렉토리 만 인쇄

$ cd /nfs//office/ && find . -name '.user.log' 
./hht/info/.user.log 
./wee1/info/.user.log 

답변

11

여기에 뭔가 빠졌습니다. 확실히이 모든 정규식 및/또는 루핑은 필요하지 않습니다. 단 하나의 라이너가 작업을 수행합니다. 또한 "for foo in $()"솔루션은 경로 이름에 공백이 있으면 실패합니다.

그냥

# make test case 
mkdir -p /nfs/office/hht/info 
mkdir -p /nfs/office/wee1/info 
touch /nfs/office/hht/info/.user.log 
touch /nfs/office/wee1/info/.user.log 

# parent's parent approach 
cd /nfs//office/ && find . -name '.user.log' | xargs -I{} dirname {} | xargs -I{} dirname {} 

# alternative, have find print parent directory, so dirname only needed once... 
cd /nfs//office/ && find . -name ".user.log" -printf "%h\n" | xargs -I{} dirname {} 

./hht 
./wee1 
+0

그리고 내가 결과 디렉토리 찾기의 허가를 찾을 수 있습니다. -name '.user_repo.로그 '| xargs -i {} dirname {} | xargs -i {} dirname {} | xargs ll – Rajeev

+0

당신이 참조하는 것은 "ls -lA"에 대해 일반적으로 사용되는 별명이고, 아니오입니다. xargs는 별칭이 아닌 명령 만 실행합니다. 그러나, 대신 "xargs ls -lA"를 수행 할 수 있습니다 ... – Adam

+0

'xargs '에 대한'-i' 플래그가 deprecated로 나열되어 있으므로'-I' 플래그를 대신 사용하십시오. –

3
for file in $(find /nfs/office -name .user.log -print) 
do 
    parent=$(dirname $(dirname $file)) 
    echo $parent 
done 

편집 : 죄송합니다 당신이 조부모 디렉토리를 원하는 놓쳤다.

0
find /nfs/office -name '.user.log' | while read line 
do 
    echo $line | awk -F/ '{print $(NF-1),$NF}' 
done 
0

은 당신이 뭔가를 할 수 있습니다 다음 xargsexpr match를 사용

cd /nfs/office/ && find . -name '.user.log' | xargs -n1 -I{} expr match {} '\(\.\(\/[^/]*\/\)\?\)' 

슬래시 문자 사이 디렉토리의 첫 경기 (/dir/)까지 .로 시작하는 부분을 추출 할 수 있습니다.

다음과 같이 될 것이다 sed를 사용하는 다른 버전 :

cd /nfs/office/ && find . -name 'file.txt' | sed -r 's|(\./([^/]*/)?).*|\1|' 
1

@trojanfoe이 올바른 생각을 갖고;

while IFS= read -r -d '' -u 9 
do 
    echo "$(dirname -- "$(dirname -- "$REPLY")")" 
done 9< <(find "/nfs/office/" -name '.user.log' -print0) | sort -u 
: 당신이 단지 독특한 이름을 에코하려면

while IFS= read -r -d '' -u 9 
do 
    echo "$(dirname -- "$(dirname -- "$REPLY")")" 
done 9< <(find "/nfs/office/" -name '.user.log' -print0) 

: this는 루프 내에서이 어떤 파일 이름으로 안전하게 작동하도록하는 단지 방법, 그리고 거의 모든 명령이다

+0

다른 파일 설명자를 사용하는 특별한 이유가 있습니까? –

+0

루프 내부에서 stdin을 사용하여 작업을 수행하려는 경우에 사용합니다. 위의 링크에서 설명합니다. – l0b0

2

당신은 find-printf 행동의 서식 옵션을 쉽게 할 수있는 생산 ... 부모의 부모를 얻기 위해, xargs를 두 번있는 dirname를 사용 (참조 man find). man page에서

cd /nfs//office/ && find . -name '.user.log' -printf "%h\n" 
./hht/info 
./wee1/info 

:

Screenshot of find manpage

%h\n 새로운 행에 각 파일에 대한 경로를 인쇄합니다.

-printf은 GNU 전용입니다. macOS (BSD 시스템)에서는 작동하지 않습니다.

0
find -type f -exec bash -c 'echo "${1%/*}"' bash {} \; 
관련 문제