그래서 여러 개의 디렉터리가 있고 "k"로 시작하고 "g"로 끝나는 디렉터리 이름만 파일에 복사하고 싶습니다. 어떻게 해야 하나요?
답변1
그리고 zsh
:
print -rC1 -- k*g(N/) > dirnames.txt
k1g
그러나 개행 문자는 파일 이름의 모든 문자만큼 유효하므로 이는 및 k2g
이름이 지정된 두 파일을 구별할 수 없음을 의미합니다 k1g<newline>k2g
.
-N
에 옵션을 추가하면 됩니다 print
.
dirs=( ${(0)"$(<dirnames.nul-delimited)"} )
그런 다음 다음과 같은 것을 사용하여 결과 파일을 사후 처리할 수 있습니다 xargs -r0a dirnames.nul-delimited some-command
.
t
하위 디렉터리(basename/ ail) 에 있는 파일 이름도 포함하려면 k*g
다음을 수행하세요.
print -rNC1 -- **/k*g(ND/:t) > dirnames.nul-delimited
예를 들어 a a/king
와 file이 모두 존재하는 경우 중복이 있을 수 있습니다. .git/king
다음을 사용하여 중복 항목을 제거할 수 있습니다.
() { print -rNC1 -- ${(u)argv} > dirnames.nul-delimited; } **/k*g(ND/:t)
사람이 읽을 수 있고 사후 처리가 가능한 파일 목록을 얻는 한 가지 방법은 셸을 사용하여 파일 이름을 인용하는 것입니다.
print -rC1 -- k*g(N/:q) > dirnames.txt
zsh
여기서는 특정 인용 변형이 사용됩니다 . 또는 이식 가능하고(sh와 유사한 쉘에서) 보다 안정적인 인용 구문을 사용하십시오.
() { print -rC1 -- ${(qq)argv} > dirnames.txt; } k*g(N/)
또는 GNU를 사용하십시오 ls
:
ls -Ud --quoting-style=shell-always -- k*g(N/) > dirnames.txt
목록은 나중에 다음을 통해 검색할 수 있습니다.
dirs=( ${(Q)${(zZ[n])"$(<dirnames.txt)"}} )
존재하다 zsh
.
또는 둘 다 zsh
또는 bash
(또는 dirs
먼저 배열로 선언한 경우 ksh93):
eval "dirs=( $(<dirnames.txt) )"
그렇게 하지 않거나 zsh
어떤 이유로 그렇게 할 수 없지만 GNU 시스템을 사용하고 파일 이름이 로케일의 유효한 텍스트로 생성된 경우 다음을 수행할 수 있습니다.
한 줄에 하나씩 인쇄합니다(파일 이름에 개행 문자가 포함되어 있지 않다고 가정).
find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\n' | sort > dirnames.txt
동일한 NUL로 구분됨:
find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\0' | sort -z > dirnames.txt
재귀적, null로 구분됨:
find . -name 'k*g' -type d -printf '%f\0' | sort -z > dirnames.txt
동일한 중복 제거:
find . -name 'k*g' -type d -printf '%f\0' | LC_ALL=C sort -zu | sort -z > dirnames.txt
인용문(배치별로 정렬되었지만)
find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\0' | xargs -r0 ls -d --quoting-style=shell-always --
올바른 견적 및 주문:
find . -mindepth 1 -maxdepth 1 -name 'k*g' -type d -printf '%f\0' | sort -z | LC_ALL=C gawk -v 'RS=\0' -v q="'" ' shquote(s) { gsub(q, q "\\" q q, s) return q s q } {print shquote($0)}' | xargs -r0 ls -d --quoting-style=shell-always --
답변2
ls
때문에 사용하지 않는 것이 가장 좋습니다.이것.
노력하다:
find * -maxdepth 0 -type d -name 'k*g' > filename.txt
(없으면 -maxdepth 0
해당 폴더의 하위 폴더도 실행됩니다. 대문자 K와 G도 함께 계산해야 하는 경우 -iname
대신 사용하세요.)-name
하이픈으로 시작하는 폴더나 파일이 있을 수 있는 경우(누가 그렇습니까?) 다음을 사용할 수 있습니다.
find . -maxdepth 1 -type d -name 'k*g' | sed 's/^\.\///' > filename.txt
-maxdepth 0
스위치는 에서 로 전환됩니다 -maxdepth 1
.
답변3
리디렉션에 쉘 와일드카드를 사용할 수 있습니다.
$ ls -d k*g/ > filename.txt
디렉토리 이름에 개행 문자가 포함되어 있으면 중단됩니다. (나생각하다파일은 선택하지 않고 디렉토리만 선택하지만 확인하기 위해 컴퓨터 앞에 있는 것은 아닙니다. )