-find / -name ".txt" -exec cp {} /junk \에서 exec 대신 파이프를 사용할 수 있습니다.

-find / -name ".txt" -exec cp {} /junk \에서 exec 대신 파이프를 사용할 수 있습니다.

/junk이름에 .txt가 있는 파일을 찾고 일치하는 각 항목을 폴더 에 복사하려면 다음 명령을 사용할 수 있습니다.

find / -name ".txt" -exec cp {} /junk \;

-exec위 명령 대신 파이프를 사용할 수 있나요 ?

파이프가 동시에(파이프의 각 측면) 작동하고 파이프가 -exec왼쪽으로 먼저 흐른 다음 오른쪽으로 흐를 것이라고 말한 사람이 기억나는 것 같습니다. 이게 그리워요? 파이프라인은 오른쪽 명령에 출력을 제공하기 전에 왼쪽 명령에서 출력을 가져와야 하므로 동시에 실행할 수 있는 방법을 모르겠습니다.

답변1

cpio이를 위해 복사 통과 모드를 사용할 수 있습니다.

find sourcedir -name "*.txt" | cpio -pd /junk

cpio표준 입력에서 파일 목록을 가져오고 복사 통과 모드에서 파일을 대상 디렉터리에 복사합니다.

답변2

find를 xargs 명령으로 파이프할 수도 있습니다.

-의 누드 클립http://www.unixmantra.com/2013/12/xargs-all-in-one-tutorial-guide.html

음악 폴더에서 모든 .mp3 파일을 찾아 ls 명령에 전달합니다. 파일 이름에 공백이 포함되어 있으면 -print0이 필요합니다.

   find ./music -name "*.mp3" -print0 | xargs -0 ls

작업 폴더에서 모든 파일을 찾아 grep에 전달하고 이익을 검색합니다.

   find ./work -print | xargs grep "profit"

동시에 세 개 이상의 매개변수를 허용하는 다양한 명령과 함께 {}를 사용해야 합니다. 예를 들어 mv 명령은 파일 이름을 알아야 합니다. 다음 명령은 현재 디렉터리 안이나 아래에 있는 모든 .bak 파일을 찾아 ~/.old.files 디렉터리로 이동합니다.

find . -name "*.sh" -print0 | xargs -0 -I {} mv {} ~/back.scripts

{}의 이름을 다른 이름으로 바꿀 수 있습니다. 다음 예시에서는 {}의 이름이 file로 바뀌었습니다. 이는 이전 예제보다 더 읽기 쉽습니다.

find . -name "*.sh" -print0 | xargs -0 -I file mv file ~/back.scripts

어디,

-0 공백이나 문자(줄바꿈 포함)가 있으면 많은 명령이 작동하지 않습니다. 이 옵션은 공백이 포함된 파일 이름을 처리합니다.

-I 초기 인수의 대체-str 발생을 표준 입력에서 읽은 이름으로 바꿉니다. 또한 따옴표가 없는 공백은 항목을 종료하지 않으며 대신 구분 기호는 개행 문자입니다.

관련 정보