다음 명령이 있습니다. .user.log
파일이있는 곳이면 부모 디렉토리를 인쇄해야합니다 (예 : hht
및 wee1
). 어떻게 수행 할 수 있습니까?파일 찾기 및 상위 디렉토리 만 인쇄
$ cd /nfs//office/ && find . -name '.user.log'
./hht/info/.user.log
./wee1/info/.user.log
다음 명령이 있습니다. .user.log
파일이있는 곳이면 부모 디렉토리를 인쇄해야합니다 (예 : hht
및 wee1
). 어떻게 수행 할 수 있습니까?파일 찾기 및 상위 디렉토리 만 인쇄
$ cd /nfs//office/ && find . -name '.user.log'
./hht/info/.user.log
./wee1/info/.user.log
여기에 뭔가 빠졌습니다. 확실히이 모든 정규식 및/또는 루핑은 필요하지 않습니다. 단 하나의 라이너가 작업을 수행합니다. 또한 "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
for file in $(find /nfs/office -name .user.log -print)
do
parent=$(dirname $(dirname $file))
echo $parent
done
편집 : 죄송합니다 당신이 조부모 디렉토리를 원하는 놓쳤다.
find /nfs/office -name '.user.log' | while read line
do
echo $line | awk -F/ '{print $(NF-1),$NF}'
done
은 당신이 뭔가를 할 수 있습니다 다음 xargs
이 expr 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|'
@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는 루프 내에서이 어떤 파일 이름으로 안전하게 작동하도록하는 단지 방법, 그리고 거의 모든 명령이다
다른 파일 설명자를 사용하는 특별한 이유가 있습니까? –
루프 내부에서 stdin을 사용하여 작업을 수행하려는 경우에 사용합니다. 위의 링크에서 설명합니다. – l0b0
당신은 find
의 -printf
행동의 서식 옵션을 쉽게 할 수있는 생산 ... 부모의 부모를 얻기 위해, xargs를 두 번있는 dirname를 사용 (참조 man find
). man page에서
cd /nfs//office/ && find . -name '.user.log' -printf "%h\n"
./hht/info
./wee1/info
:
%h\n
새로운 행에 각 파일에 대한 경로를 인쇄합니다.
-printf
은 GNU 전용입니다. macOS (BSD 시스템)에서는 작동하지 않습니다.
find -type f -exec bash -c 'echo "${1%/*}"' bash {} \;
그리고 내가 결과 디렉토리 찾기의 허가를 찾을 수 있습니다. -name '.user_repo.로그 '| xargs -i {} dirname {} | xargs -i {} dirname {} | xargs ll – Rajeev
당신이 참조하는 것은 "ls -lA"에 대해 일반적으로 사용되는 별명이고, 아니오입니다. xargs는 별칭이 아닌 명령 만 실행합니다. 그러나, 대신 "xargs ls -lA"를 수행 할 수 있습니다 ... – Adam
'xargs '에 대한'-i' 플래그가 deprecated로 나열되어 있으므로'-I' 플래그를 대신 사용하십시오. –