cp 및 grep을 사용하는 자세한 bash 스크립트가 파일 이름의 공백과 작동하지 않습니다.

cp 및 grep을 사용하는 자세한 bash 스크립트가 파일 이름의 공백과 작동하지 않습니다.

나 자신은 절대로 이 작업을 수행하지 않을 것이지만 Windows 시스템을 사용하는 사람들은 파일 이름에 공백을 추가해야 한다고 주장합니다.

나는 이 상세한 명령을 작성했고 공백이 있는 파일을 제외하고는 잘 작동합니다. 작은 따옴표, 큰 따옴표, 틱, 백슬래시로 이스케이프 등 모든 것을 시도했습니다.

이 명령은 복사하고 싶지 않은 파일 목록을 제외하고 특정 파일 확장자를 가진 디렉터리의 모든 항목을 복사해야 합니다. 불행하게도 이러한 파일 중 일부에는 공백이 포함되어 있습니다. 이것은 명령입니다:

cp $(ls *.txt *.docx | grep --invert-match --fixed-strings \
-e not_this_one.txt \
-e not_this_one_either.docx \
-e "no not me.txt" \
-e "please leave me out as well.docx")  ./destination_directory/

이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변1

매개변수 확장 대신 find및 사용 :xargs$(...)

find *.txt *.docx \( \
      -name not_this_one.txt \
      -o -name not_this_one_either.docx \
      -o -name 'no not me.txt' \
      -o -name "please leave me out as well.docx" \
    \) -prune -o -print0 |
  xargs -0 cp -t /tmp/destination_directory

-prune복사하고 싶지 않은 콘텐츠를 제외하려면 이 옵션을 사용합니다 .

-print0파이프로 연결할 때 xargs -0공백이 포함된 파일 이름을 올바르게 처리하는 NUL 종료 파일 이름을 생성하기 위해 find 명령을 사용합니다 .

마지막으로, 파일 이름 목록을 명령에 추가할 수 있도록 -t <target_directory>on 옵션을 사용합니다 (그렇지 않은 경우 대상 디렉터리가 끝에 있어야 하므로 상황이 약간 복잡해집니다).cpxargs-t


또는 다음을 사용하십시오 tar.

tar -cf- \
    --exclude=not_this_one.txt \
    --exclude='not_this_one_either.docx' \
    --exclude='no not me.txt' \
    --exclude='please leave me out as well.docx' *.txt *.docx |
  tar -C /tmp/destination_directory -xf-

(물론 제외 패턴 목록을 파일에 넣어서 사용해도 됩니다 --exclude-from.)

답변2

ls *.txt *.docxtru에 파이프를 보내면 |쉘이 생성됩니다.문자열파일이 분리되지 않은 곳. 공백(또는 줄 바꿈)으로 구분할 수 있는데, 이는 공백(또는 줄 바꿈)에서 이러한 문자열을 사용하여 파일 이름을 분할하려고 시도하는 다음 도구에서 혼란을 야기할 것입니다.

질문에 bash로 태그를 지정했으므로 glob의 확장은 쉘(bash)에 의해 수행되며 bash는 GLOBIGNORE에 제공된 특정 파일 모드를 거부할 수 있으므로 간단하게 다음을 수행할 수 있습니다 *.txt.*.docx

( GLOBIGNORE='not_this_one.txt:not_this_one_either.docx:no not me.txt:please leave me out as well.docx';
  echo \
  cp -t /tmp/destination_directory *.txt *.docx
)

이는 (...)서브셸이 닫힌 후 GLOBIGNORE 설정이 제거되도록 하기 위해 수행됩니다. 물론 삭제하고 진행하셔도 됩니다 unset GLOBIGNORE. Echo는 명령 결과를 표시하는 데 사용됩니다. 결과가 만족스러우면 에코를 제거하세요.

관련 정보