다음 형식으로 출력하고 싶습니다.
/media/username/New/Audio/time machine by Ariya Hedie.mp3
/media/username/New/Audio/You areever alone by Dj Quads.flac
/media/username/New/Audio/You'rehe Boss by The Barr Brothers.opus
/media/username/New/Audio/Your Wedding byosimo Fogg.mp3
/media/username/New/Audio/You,y Love by Floppyircus.opus
/media/username/New/Library/Yup byteven O'Brien.flac
/media/username/New/Library/Zen by Warptech.opus
/media/username/New/Library/無機質な怒りに対する優しさの反論.opus
/media/username/New/Library/鎖 -hain Border byaoyaakamata.opus
파일은 opus, mp3 등 다양한 형식의 음악 파일입니다. 폴더에는 음악이 아닌 파일이 포함되어 있지 않습니다. 파일 이름에는 유니코드 문자가 포함되는 경우가 많습니다.
답변1
.lua
이름이 디렉토리 안이나 아래로 끝나는 일반 파일에 대한 전체 경로를 원할 경우 /media/username
표준 find
.
LC_ALL=C find /media/username -name '*.lua' -type f
목록을 사전순으로 정렬하려면 로 파이프할 수 있지만 sort
이는 파일 경로에 개행 문자가 포함되지 않은 특수한 경우에만 작동하며 여러 줄의 파일 경로에 대해 흩어진 줄이 생길 수 있습니다. 예를 들어:
/media/username/my
dir/my
strange file.lua
로 파이프되면 sort
다음과 같이 됩니다(대부분의 로케일에서).
dir/my
/media/username/my
strange file.lua
여러 줄 경로를 끊지 않고 이러한 경로를 정렬하려면 다음을 수행할 수 있습니다.
LC_ALL=C find /media/username -name '*.lua' -type f -print0 |
sort -z |
tr '\0' '\n'
여기에는 GNU 확장이 필요하므로 find
더 sort
이상 표준이 아닙니다.
또는 bash 대신 zsh 쉘을 사용할 수 있습니다. 해당 glob은 모든 셸에서와 같이 기본적으로 어휘적으로 정렬되지만 파일 유형별 필터링( 여기 예제 .
와 동일한 한정자 사용)도 허용하고 재귀적 Globbing을 지원합니다.-type f
print -rC1 /media/username/**/*.lua(ND.)
다른 대안은 다음 find
과 같습니다.rawhide
C와 유사한 쿼리 언어를 사용하십시오.
LC_ALL=C rh -e '"*.lua" && file' /media/username
또는fd-find
fdfind
, 때로는 일부 시스템에서 사용 가능합니다.
fdfind -usgtf '*.lua' /media/username
부족:
fdfind --unrestricted --case-sensitive --glob --type file '*.lua' /media/username
( / fdfind
도 있지만 / 플래그를 무시하는 것 같고 일반적으로 자신이 원하는 것이 무엇인지 자신보다 더 잘 안다고 생각하는 성가신 경향이 있습니다.)-e
--extension
-s
--case-sensitive
fdfind
목록 정렬에 대한 기본 지원 도 없지만 rh
동일한 트릭을 사용하여 NUL로 구분된 목록(둘 다 옵션 포함)을 인쇄 하고 -0
원하는 경우 sort -z
NUL을 개행으로 tr
구분된 목록 으로 파이프할 수 있습니다.
이 *.lua
패턴은 쉘 글로브에 사용된 패턴과 동일합니다. *
임의 개수의 문자와 일치합니다. 문자를 형성하는지 여부에 관계없이 모든 바이트 시퀀스를 일치시키기 위해 일부 도구와 일부 시스템 또는 버전에서는 환경을 find 명령에 C
전달하여 로케일을 설정합니다.LC_ALL=C
이름에 관계없이 일반 파일을 찾으려면 다음을 수행하십시오.
-name '*.lua'
다음으로 제거find
(더 이상 필요하지 않음LC_ALL=C
)- zsh에서
**/*.lua
다음으로 변경합니다.**/*
"*.lua" && file
justfile
(또는 evenf
) inrh
(그리고 다시 not require ) 로 변경하세요LC_ALL=C
.- / 옵션을 사용
'*.lua'
하거나 제거 하고 정규식을 패턴으로 사용하도록 변경합니다 .'*'
fdfind
-g
--glob
.
.mp3
.flac
이름이 다음 중 하나로 끝나는 파일을 일치시키려면 다음을 수행하십시오 .opus
.
'(' -name '*.flac' -o -name '*.mp3' -o -name '*.opus' ')' -type f
표준find
(find
일부 구현에서도 지원되지만-regex
정규식 스타일 및 구문은 구현마다 다릅니다).**/*.(flac|opus|mp3)
zsh에서"*.@(flac|opus|mp3)" && file
rh(fnmatch()
ksh88 확장 glob 패턴 연산자를 지원하는 시스템)에서 사용하거나"\.(flac|opus|mp3)\z".re && file
지원되지 않는 경우 사용됩니다.-ustf '\.(flac|open|mp3)$'
fdfind에서(glob 패턴 대신 정규식 사용)
대소문자를 구분하지 않고 일치시키려면
'(' -name '*.[fF][lL][aA][cC]' -o -name '*.[mM][pP]3' -o -name '*.[oO][pP][uU][sS]' ')' -type f
표준에서find
(일부 구현에서는 및find
도 지원함 )-iname
-iregex
**/*.(#i)(flac|opus|mp3)
zsh에서 (set -o extendedglob
사전 필요)"*.@(flac|opus|mp3)".i && file
rh(fnmatch()
ksh88 확장 glob 패턴 연산자를 지원하는 시스템)에서 사용하거나"\.(flac|opus|mp3)\z".rei && file
지원되지 않는 경우 사용됩니다.- fdfind에서
-s
/를 제거합니다. 패턴에 대문자가 포함되어 있으면 /--case-sensitive
도 필요합니다-i
.--ignore-case
zsh를 사용하여 무엇이든 할 수 있도록 배열의 파일 목록을 얻으려면 다음을 수행하십시오.
set -o extendedglob
files=( /media/username/**/*.(#i)(flac|opus|mp3) )
do-anything-with $files
존재하다 bash
:
readarray -td '' < <(find ... -print0 | sort -z)
do-anything-with "${files[@]}"
(bash 4.4 이상이 필요합니다).
1 -e
또한 확장자의 왼쪽 부분이 UTF-8로 디코딩될 수 없는 파일 이름과 일치하지 않는 것 같습니다(UTF-8을 사용하지 않는 로케일에서도). 그러나 확장자가 아닌 이름이 로만 명명된 파일의 경우 이것이 실제로 이상적일 수 있다고 .lua
생각 합니다 . lua
glob 패턴 기반 접근 방식을 사용하여 이 효과를 얻으려면 패턴을 *?.lua
또는 으로 변경하여 확장자 앞에 최소한 한 문자( 1바이트 포함)가 ?*.lua
오도록 할 수 있습니다.LC_ALL=C
답변2
globstar
및 활성화를 사용하면 extglob
특정 패턴과 일치하는 파일 이름을 반복적으로 찾을 수 있습니다.
shopt -s globstar extglob
예를 들어 를 media/
사용 mp3
하거나 flac
이 터미널 아래의 모든 파일을 인쇄하려면 opus
다음을 실행할 수 있습니다.
printf '%s\n' media/**/*.@(mp3|flac|opus)
일치하는 모든 파일을 처리해야 하는 경우 외부 프로그램을 호출하지 않고도 처리할 수 있습니다 find
. 예를 들면 다음과 같습니다.
#!/bin/bash
shopt -s globstar extglob
for file in media/**/*.@(mp3|flac|opus); do
echo "do something with $file"
done
또한 nullglob
일치하는 항목이 없을 때 출력이 생성되지 않도록 옵션을 추가할 수 있습니다.
이 명령으로 동일한 작업을 수행할 수 있지만 find
작성하기가 훨씬 어렵고 오류가 발생하기 쉽습니다.
find media/ \( \( -name '*.mp3' \) -o \( -name '*.flac' \) -o \( -name '*.opus' \) \) -exec echo do something with '{}' \;