저는 일정한 문자열 집합(로그 파일, 기록, 데이터 세트 등)을 기반으로 들어오는 파일을 처리하는 정렬/필터 cron 스크립트를 개발 중입니다. 정렬할 파일은 모두 공통 폴더 아래에 있으며, 일부는 기본 폴더에, 일부는 하위 폴더에 있습니다. 현재 나의 주요 관심사인 Debian/bash(MX Linux)에서 이 작업을 수행하고 있지만 결국에는 Debian/ash(dCore Linux) 시스템으로 이동할 것입니다.
- 파일 및 폴더 이름언제나STRING이 포함되어 있으며 STRING에는 대소문자가 혼합되어 포함될 수 있습니다.
- 파일 이름과 파일이 위치한 하위 폴더는 다음과 같습니다.둘 다STRING을(를) 포함합니다.
- 폴더그리고STRING에는 파일이 포함될 수 있습니다.아니요끈. 상위 폴더와 함께 이동해야 합니다.
- 파일 및 폴더 이름에는 공백, 괄호 및 대괄호가 포함될 수 있습니다.
예:
/main/ # folder being searched
/main/filename.log # should not be moved
/main/filename containing-STRING.log # should be moved
/main/subfolder/ # should not be moved
/main/subfolder/file.txt # should not be moved
/main/subfolder.with STRING in-name/ # should be moved
/main/subfolder.with STRING in-name/STRING-file.log # should be moved along with parent
/main/subfolder.with STRING in-name/file.txt # should be moved along with parent
나의 출발점:
find . -iname '*STRING*' -exec mv {} ../offload/ \;
이는 "파일을 찾을 수 없음" 오류가 발생하더라도 작동합니다. 아마도 상위 폴더가 이동될 때 파일이 이미 이동되었기 때문일 것입니다. 모든 하위 폴더에는 항상 STRING이 포함되어 있으므로 해당 콘텐츠를 반드시 "찾을" 필요도 없고 싶지도 않습니다. 상위 폴더만 이동하면 됩니다. 그래서 홈 폴더에서만 STRING을 "찾기" 위해 "-maxlength 0"을 사용해 보았습니다.
find . -maxdepth 0 -iname '*STRING*' -exec mv {} ../offload/ \;
-maxlength 스위치를 추가해도 아무런 효과가 없습니다. "파일을 찾을 수 없음" 경고는 없지만 아무것도 이동되지 않습니다. 내가 어디로 잘못 가고 있는지에 대한 제안이 있습니까?
편집: 저는 bash 쉘과 dCore 시스템 및 기본 ash 쉘에만 액세스할 수 있습니다. 이는 CLI 전용 미니 시스템이므로 다른 셸 환경을 추가할 공간이 없습니다.
나는 시도했다:
find . -maxdepth 0 -type d -iname '*STRING*' -exec mv {} ../offload/ \;
실행하면 오류 없이 프롬프트로 돌아가지만 아무것도 이동되지 않습니다.
@cas 예, 디렉터리 구조를 보존해야 하지만 두 예제 중 어느 것도 검색을 만족해서는 안 됩니다. STRING과 일치하는 홈 폴더의 파일과 디렉터리만 찾아서 이동하고 싶습니다. 그러므로:
/main/filename-with-STRING # match
/main/folder-with-STRING/ # match
/main/folder-with-STRING/foo/ # moved along with parent
/main/subfolder/filename-with-STRING # no match
/main/subfolder/folder-with-STRING/ # no match
답변1
일치하는 모든 디렉터리를 먼저 이동한 다음 유지되고 일치하는 모든 파일, 심볼릭 링크를 이동하려는 것처럼 들립니다.
-type d
첫 번째 find
실행 시 디렉터리를 지정하고 '(' -not -type d ')'
두 번째 실행 시 디렉터리를 지정 하면 됩니다 find
.
그러나 find
최신 셸을 사용하여 이 작업을 수행할 수 있습니다.
#!/usr/bin/zsh
# probably already enabled! So, just for reference:
setopt extended_glob
# also match "hidden" files, i.e., such that start with a dot
setopt dotglob
# we don't care about case!
setopt nocaseglob
# move all directories.
mv **/*STRING*(/) ../offload/
# move all non-directories
mv **/*STRING*(^/) ../offload/