`find` 명령의 추가 -exec 옵션에서 모든 파일/디렉토리를 표시하는 방법은 무엇입니까?

`find` 명령의 추가 -exec 옵션에서 모든 파일/디렉토리를 표시하는 방법은 무엇입니까?

내 임무는 특별한 이름을 가진 여러 디렉터리의 모든 파일을 대상 디렉터리에 복사하는 것입니다.

그래서 저는 명령을 테스트하기 위해 이 디렉토리를 만들었습니다. 테스트 디렉터리 트리는 다음과 같습니다.

.
├── dir1
│   └── file1
└── test

mv dir1의 모든 파일을 테스트하려는 명령은 다음과 같습니다.

find . -type d -name "*dir*" -exec mv {}/* test \;

그러면 나는 다음을 얻습니다:

mv: rename ./dir1/* to test/*: No such file or directory

이는 명령이 추가 -exec 표현식에서 *를 와일드카드 문자로 처리하지 않기 때문이라고 생각합니다.

그래서 나는 이렇게 했습니다:

find . -type d -name "*dir*" -exec mv {}/file1 test \;

테스트를 위해 file1을 성공적으로 이동했습니다.

하지만 요점은 이제 이 파일 전송 작업을 수행하려면 모든 파일에 대한 표현식이 필요하다는 것입니다.

find -exec이 사실을 지휘 그룹에 어떻게 전달합니까 ?

답변1

mv "$dir_path"/* ..."$dir_path"파일뿐만 아니라 이름이 최소한 점으로 시작하지 않는 모든 파일(숨겨진 파일) 도 이동됩니다 . Bash에서는 options 를 사용하여 이 설정을 변경할 수 있습니다 dotglob. 그러나 *잘 확장되면(모든 것과 일치하지만 명령줄에 비해 너무 많지 않은 경우) 쉘 간접 참조를 사용할 수 있습니다.

find . -type d -name "*dir*" -exec bash -c 'mv "$0"/* /path/to/test' {} \;

답변2

노력하다:

$ find -type d -name '*dir*' -exec sh -c '
  for d do
    for f in "$d"/*; do
      [ -f "$f" ] && mv -- "$f" /path/to/test
    done
  done
' sh {} +

답변3

이것을 시도해 볼 수도 있습니다. 테스트 디렉터리가 다른 디렉터리와 동일한 디렉터리에 있다는 점을 고려하면,

find . -mindepth 2  ! -name test -exec cp {} test \;

그러면 모든 개별 파일이 dir1, dir2 등을 이스케이프하여 test 디렉토리에 복사됩니다. 이렇게 하면 하위 디렉터리 자체가 생략되고 해당 내용이 복사됩니다. ls 명령을 사용하여 이를 테스트할 수도 있습니다.

find . -mindepth 2  ! -name test -ls 

관련 정보