나 자신은 절대로 이 작업을 수행하지 않을 것이지만 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 옵션을 사용합니다 (그렇지 않은 경우 대상 디렉터리가 끝에 있어야 하므로 상황이 약간 복잡해집니다).cp
xargs
-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 *.docx
tru에 파이프를 보내면 |
쉘이 생성됩니다.문자열파일이 분리되지 않은 곳. 공백(또는 줄 바꿈)으로 구분할 수 있는데, 이는 공백(또는 줄 바꿈)에서 이러한 문자열을 사용하여 파일 이름을 분할하려고 시도하는 다음 도구에서 혼란을 야기할 것입니다.
질문에 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는 명령 결과를 표시하는 데 사용됩니다. 결과가 만족스러우면 에코를 제거하세요.