folder1
공백이 포함된 경로 변수가 있습니다.
TEST=path/with\ space/to/folder1/
모든 파일을 연결하고 싶지만 오류가 발생합니다 folder1
.cat
cat "$TEST"* > test
cat: path/with: No such file or directory
cat: 'space/to/folder1/*': No such file or directory
이 작업을 직접 시도하면 cat path/with\ space/to/folder1/ > test
작동합니다.
또한 큰따옴표를 사용할 수도 있습니다.
TEST="path/with space/to/folder1/"
cat "$TEST" > total
하지만 경로를 사용하여 이를 올바르게 수행하는 방법은 무엇입니까 \
?
답변1
find
나는 이것을 위해 그 옵션을 사용할 것입니다 . -exec
예를 들어:
TEST='path/with space/to/folder1/'
find "$TEST" -maxdepth 1 -type f -exec cat {} + > test
이 -maxdepth 1
옵션은 "$TEST" 아래의 하위 디렉터리로의 재귀를 방지합니다. 필요에 따라 변경하거나 삭제할 수 있습니다. -type f
일반 파일만 일치합니다(예: 디렉터리, 명명된 파이프, 기호 링크 등 제외).
특정 파일 이름 패턴과 일치하도록 하려면 -name
또는 -regex
옵션(예 -name '*.txt'
: )을 사용하거나 대소문자를 구분하지 않는 -iname
/ 를 사용할 수 있습니다 -iregex
.
find
더 많은 옵션이 있고 매우 유연하지만, 또한 매우 복잡하고 모든 기능을 배우려면 시간과 노력이 필요합니다. 그러나 노력할 가치가 있습니다. 매뉴얼 페이지를 읽고 연습해보세요 :-)
한 가지 주목할 점은 find
기본적으로 의 술어가 함께 AND로 연결된다는 것입니다. 즉, 파일이 있는 경우 -name '*.txt' -name '*.csv'
.txt와 .csv로 끝나는 파일을 모두 일치시키려고 시도합니다(이는 불가능하므로 어떤 것과도 일치하지 않습니다). OR 조건자를 사용하려면 다음을 수행해야 합니다.
find "$TEST" -maxdepth 1 -type f \( -name '*.txt' -o -name '*.csv' \) \
-exec cat {} + > test
이는 .txt 또는 .csv로 끝나는 파일과 일치합니다. OR 연산의 술어는 연산과 마찬가지로 괄호 안에 넣어 그룹화됩니다. 전체 줄은 "$TEST 디렉터리에서 최대 깊이 1의 일반 파일과 (.txt 또는 .csv로 끝나는 이름)을 찾아 이에 대해 cat을 수행합니다. 출력을 test라는 파일로 리디렉션합니다"라고 읽습니다.
또한 주목할 가치가 있는 것은 options {}
의 파일 이름에 대한 자리 표시자 입니다 -exec
. +
끝에 있는 옵션은 각 명령줄에 가능한 한 많은 파일 이름을 맞추도록 지시합니다(그래서 가능한 -exec
한 적은 횟수로 실행됩니다). 한도는find
cat
ARG_MAX, 이는 최신 Linux 시스템에서 약 200만 바이트의 가치가 있습니다.
사용할 수도 있습니다 \;
. 이는 +
각 파일 이름을 한 번 find
실행하도록 지시합니다 cat
(따라서 속도가 훨씬 느려지지만 때로는 한 번에 하나의 파일 이름으로 실행하는 것이 필요한 경우도 있습니다. 다른 경우에는 일괄 실행하는 것이 +
올바른 일입니다).