xargs 내에 중첩된 명령

xargs 내에 중첩된 명령

파일 폴더 폴더가 있습니다. 모든 파일을 상위 파일로 복사하려고 합니다. 다음 명령은 dirname "{}"find 명령보다 먼저 실행되므로 작동하지 않습니다. 무엇을 할 수 있나요?

find . -name "*" -type f | xargs -I "{}" cp "{}" `dirname "{}"`

답변1

현재 작업 디렉터리에서 디렉터리 트리 아래의 모든 파일을 각 파일의 상위 디렉터리로 이동하려면 break xargs또는 dirnamefind수행할 필요조차 없습니다.

$ tree
.
+--- dir1
|   +--- somefile
+--- dir2
|   +--- someotherfile
$ find . -type f -execdir mv "{}" ../ \;
$ tree
.
+--- dir1
+--- dir2
+--- somefile
+--- someotherfile

execdirfor 옵션은 find일치하는 각 파일이 있는 디렉터리에서 지정된 명령을 실행합니다.

답변2

DopeGhoti의 XY 문제를 해결하는 것 외에도 실제 문제에 대한 답변을 제공하고 싶습니다. IMHO가 알아두면 좋은 점은 다음과 같습니다. cp 명령을 다른 쉘로 묶습니다.

find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`'

이것이 작동하지 않기 때문에(cp 명령은 파일을 이미 있는 디렉토리에 복사하려고 시도하기 때문에 다음과 같이 /..를 추가해야 합니다:

find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`/..'

관련 정보