여러 개의 큰 폴더에 있는 모든 파일을 찾고 싶지만 .mb
내 검색 기준과 일치하는 파일이 많으면 각 폴더에서 하나의 파일만 반환하고 싶습니다.
폴더 구조
..
--abc
|_scenes
| |__ file1.mb
| |__ file2.mb
|...
--def
|_scenes
| |__ file3.mb
| |__ file4.mb
|...
만약 내가한다면
find /net/*/scenes -maxdepth 1 -type f -size +200M
그것은 모두를 반환
file1.mb
file2.mb
file3.mb
file4.mb
file1.mb
합계 만 반환하려면 어떻게 해야 합니까 file3.mb
?
답변1
find
+awk
해결책:
find /net/*/scenes -maxdepth 1 -type f -name "*.mb" \
| awk -F'/' '{ fn = $NF; $NF = "" }!a[$0]++{ print $0 fn }' OFS='/'
-F'/'
및OFS='/'
- 입력 및 출력 필드 구분 기호를 나타냅니다.fn = $NF
- 마지막 필드 값(예: 파일 이름)을 변수에 저장합니다.fn
!a[$0]++{ print $0 fn }
- 고유한 디렉터리 경로가 처음 나타날 때$0
이 줄(전체 파일 경로)을 인쇄합니다 (다음으로 표시됨).
또는 GNU coreutils
파이프를 사용하십시오.
find /net/*/scenes -maxdepth 1 -type f -name "*.mb" -printf "%H %p\n" \
| sort -k1,1 -u | cut -d' ' -f2
답변2
귀하의 새로운 편집 내용은 귀하 tcsh
가 처음에 를 사용하고 있다고 가정했습니다 bash
. 호출 내 find
에서 호출하고 각 내부 호출을 파이프하여 첫 번째 결과를 추출할 수 있습니다.find -exec
find
head
find /net/* -maxdepth 1 -exec tcsh -c "find {} -maxdepth 1 -type f -name '*.mb' -size +200M | head -1" \;
다음은 간단한 예시 데모입니다.
# Create the directory structure
mkdir -p test/abc/scenes
mkdir -p test/def/scenes
# Create example data files
dd if=/dev/zero of=abc/scenes/file1.mb bs=201M count=1
dd if=/dev/zero of=abc/scenes/file2.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file3.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file4.mb bs=201M count=1
# Execute the find command
find ./* -maxdepth 1 -exec tcsh -c "find {} -maxdepth 1 -type f -name '*.mb' -size +200M | head -1" \;
그러면 다음과 같은 출력이 생성됩니다.
./abc/scenes/file1.mb
./def/scenes/file3.mb
원래 질문은 지정되지 않았습니다 tcsh
. 루프 내에서 호출하고 각 호출을 파이프하여 첫 번째 결과를 추출할 bash
수 있습니다 .find
find
head
for directory in /net/*/scenes; do
find "${directory}" -maxdepth 1 -type f -name '*.mb' -size +200M | head -1;
done
다음은 간단한 예시 데모입니다.
# Create the directory structure
mkdir -p test/abc/scenes
mkdir -p test/def/scenes
# Create example data files
dd if=/dev/zero of=abc/scenes/file1.mb bs=201M count=1
dd if=/dev/zero of=abc/scenes/file2.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file3.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file4.mb bs=201M count=1
# Execute the find command
for directory in ./*/scenes; do
find "${directory}" -maxdepth 1 -type f -name '*.mb' -size +200M | head -1;
done
그러면 다음과 같은 출력이 생성됩니다.
./abc/scenes/file1.mb
./def/scenes/file3.mb
답변3
먼저 2개의 find 명령을 사용하여 디렉토리를 찾은 다음 각 디렉토리 내에서 검색하십시오.
while read dir; do find "$dir" -name "*.mb" -maxdepth 1 | head -1 ; done << EOF
$(find /net/*/scenes -type d)
EOF