내 임무는 특별한 이름을 가진 여러 디렉터리의 모든 파일을 대상 디렉터리에 복사하는 것입니다.
그래서 저는 명령을 테스트하기 위해 이 디렉토리를 만들었습니다. 테스트 디렉터리 트리는 다음과 같습니다.
.
├── 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