tcsh에서 find 명령을 사용하여 각 폴더에서 첫 번째로 일치하는 결과를 반환하려면 어떻게 해야 합니까?

tcsh에서 find 명령을 사용하여 각 폴더에서 첫 번째로 일치하는 결과를 반환하려면 어떻게 해야 합니까?

여러 개의 큰 폴더에 있는 모든 파일을 찾고 싶지만 .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 -execfindhead

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수 있습니다 .findfindhead

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

관련 정보