100개의 하위 디렉터리가 있는 상위 폴더가 있는데 그 중 50개에는 파일이 있고 50개에는 파일이 .dlg
없습니다..dlg
.dlg
이제 파일이 포함된 하위 폴더를 전체적으로 다른 폴더로 이동하고 .dlg
파일 없이 해당 하위 폴더를 처리하고 싶습니다 .
답변1
find . -type d -exec sh -c '
for dir; do
ls -- "$dir/"*.dlg >/dev/null 2>&1 && \
echo mv -v -- "$dir" /move/to/tmp/;
done
' sh {} +
드라이 러닝 이동 디렉터리 echo
에 대한 명령이 제거되었습니다 .mv
답변2
이 find
명령은 이러한 작업에 이상적입니다.
먼저 테스트용으로 몇 가지 파일을 설정하겠습니다.
$ mkdir -p tmp/testing/{1..100}
$ find tmp/testing -mindepth 1 | shuf | head -50 | while read d; do touch "$d"/foo.dlg; done
그러면 100개의 디렉토리가 생성되고 그 중 임의의 50개에는 이라는 이름이 포함됩니다 foo.dlg
. 이제 디렉토리를 어딘가로 이동하려고 합니다.
$ mkdir tmp/testing2/
$ find tmp/testing -type f -regex ".*\.dlg" -exec dirname {} + | while read d; do mv "$d" tmp/testing2/; done
이 find
명령은 확장자가 .dlg인 모든 파일을 찾아서 tmp/testing
실행합니다. dirname
이 dirname
명령은 파일이나 디렉터리의 긴 목록을 가져와서 인수에 해당하는 디렉터리 목록을 반환합니다.
따라서 이러한 모든 디렉터리 이름을 얻은 후 이동을 수행하는 루프에 이를 전달합니다. 물론, mv -v
발생한 일에 대해 더 자세한 피드백을 원할 경우 그렇게 할 수 있습니다.