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 ... ]
디렉터리에서 비정규 파일(또는 일반 파일에 대한 심볼릭 링크)인 모든 항목을 건너뜁니다.