변수 내부에 공백이 있는 디렉터리 경로를 사용하여 디렉터리의 모든 파일을 어떻게 캡처할 수 있습니까?

변수 내부에 공백이 있는 디렉터리 경로를 사용하여 디렉터리의 모든 파일을 어떻게 캡처할 수 있습니까?

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한 적은 횟수로 실행됩니다). 한도는findcatARG_MAX, 이는 최신 Linux 시스템에서 약 200만 바이트의 가치가 있습니다.

사용할 수도 있습니다 \;. 이는 +각 파일 이름을 한 번 find실행하도록 지시합니다 cat(따라서 속도가 훨씬 느려지지만 때로는 한 번에 하나의 파일 이름으로 실행하는 것이 필요한 경우도 있습니다. 다른 경우에는 일괄 실행하는 것이 +올바른 일입니다).

관련 정보