콘텐츠에 따라 파일 이동

콘텐츠에 따라 파일 이동

25보다 큰 숫자를 포함하지만(적어도 한 인스턴스에서는) 문자열 다음에 25보다 작은 숫자를 포함하지 않는 모든 파일을 이동하고 싶습니다. >난수_xxx_를 특정 폴더로 이동합니다.

이동해야 하는 파일의 예:

>23424_xxx_26
>331134_xxx_27
>6634_xxx_30

이동할 필요가 없는 파일의 예:

>22234_xxx_20
>434534_xxx_27

답변1

따라서 첫 번째 문제는 이동해야 하는 파일을 검색하는 것입니다.

이는 다음을 사용하여 수행할 수 있습니다 grep.

grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]{3,})$'

입력 데이터에 지정된 확장 정규식과 일치하는 행이 포함된 경우 이러한 명령은 true를 반환합니다.

이 표현식은 _(1?[0-9]|2[0-4])$밑줄 뒤 줄 끝에 나타나는 25보다 작은 양의 정수와 일치하고 _(2[5-9]|[3-9][0-9]|[0-9]{3,})$밑줄 뒤 줄 끝에 나타나는 25보다 크거나 같은 양의 정수와 일치합니다(0이 없다고 가정). -패딩된 정수(예 002: ). >줄의 시작 부분에서도 일치합니다 . 이 옵션은 -q실제로 중지됩니다.grep산출무엇이든 가능합니다(행 중 하나를 찾을 수 있는지에만 관심이 있습니다).

파일을 복사하려면 첫 번째 파일을 grep반환해야 합니다.잘못된두 번째는 grep돌아와야 해진짜.

이것을 디렉터리의 모든 파일에 적용합니다(이 경우에는 파일에 대해 아무 말도 하지 않았기 때문에 파일 이름에 관계없이).

for filename in ./*; do
    [ ! -f "$filename" ] && continue

    if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
         grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]{3,})$' "$filename"
    then
        mv -i "$filename" /some/destination
    fi
done

그러면 요구 사항을 충족하는 파일이 대상 디렉터리로 이동됩니다 /some/destination. 이 -i옵션을 사용 mv하면 이동 중인 파일과 동일한 이름을 가진 기존 파일을 덮어쓰기 전에 유틸리티에서 확인을 요청하게 됩니다.

루프의 첫 번째 테스트는 [ ! -f ... ]디렉터리에서 비정규 파일(또는 일반 파일에 대한 심볼릭 링크)인 모든 항목을 건너뜁니다.

관련 정보