"find -exec mv" 명령줄의 -maxlength에 대한 도움말

"find -exec mv" 명령줄의 -maxlength에 대한 도움말

저는 일정한 문자열 집합(로그 파일, 기록, 데이터 세트 등)을 기반으로 들어오는 파일을 처리하는 정렬/필터 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/

관련 정보