(확장자 포함) 파일이 많습니다 .fna
. 문자가 포함된 경우 이동해야 합니다.>특정 횟수.
어떤 파일이 포함되어 있는지 알고 있습니다.>이 명령을 특정 횟수만큼 사용하십시오(이 예에서는 9회).
grep -c ">" *.fna | grep ":9"
이것은 다음과 같은 출력을 제공합니다
5242_ref.fna:9
9418_ref.fna:9
그런데 이 파일을 다른 폴더로 옮기는 방법을 모르겠습니다.
감사해요.
답변1
( 양수 일치가 파일 이름만 반환하도록 egrep
옵션으로 호출 )을 다음과 결합하여-l
xargs
텍스트 일치를 기반으로 임의 명령을 실행할 수 있습니다.
[gnubeard@mothership: ~/mver]$ ls
destination example.fna non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>>>>>>>>
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ egrep -l '>{9}' *.fna | xargs -I{} mv {} destination/
[gnubeard@mothership: ~/mver]$ ls
destination non_example.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna
편집: 파일이 다른 문자나 개행 문자로 구분된 경우 특정 수의 문자 인스턴스가 있는 파일과 일치하지 않습니다. 필요에 따라 실행해야 하는 짧은 스크립트를 만들었습니다.
#! /usr/bin/env bash
DESTINATION=./destination
MATCH_CHAR='>'
MATCH_COUNT=9
for FILE in $1; do
MATCHES=$(grep -o $MATCH_CHAR $FILE | wc -l)
if [ $MATCHES -eq $MATCH_COUNT ]; then
mv $FILE $DESTINATION
fi
done
예:
[gnubeard@mothership: ~/mver]$ ls
destination example.fna mver non_example.fna
[gnubeard@mothership: ~/mver]$ cat example.fna
>>
>>foo>>bar>>>baz
[gnubeard@mothership: ~/mver]$ cat non_example.fna
<<<<<<<<<
>>
[gnubeard@mothership: ~/mver]$ ./mver *.fna
[gnubeard@mothership: ~/mver]$ ls destination/
example.fna
[gnubeard@mothership: ~/mver]$ ls
destination mver non_example.fna
답변2
zsh와 그 기능을 사용할 수 있습니다전역 한정자로서의 표현식다음과 같은 기호가 9개만 있는 파일을 선택하세요.
$ hasnine() { [[ $(tr -dc '>' < "$REPLY" | wc -c) -eq 9 ]]; }
$ mv *.fna(+hasnine) location/
>
첫 번째 줄은 9개의 기호가 포함된 파일에 대해 참/거짓 필터를 생성하는 것이 목적인 함수를 정의합니다 . 이 tr
명령은 입력(변수에 예상됨)에 대해 작동하고 REPLY
a가 아닌 모든 항목을 제거한 다음 결과의 문자 수를 계산 >
하도록 요청한 다음 해당 출력을 9와 비교합니다.wc
두 번째 줄은 명령을 실행하여 mv
*.fna 파일을 (예제) 디렉터리와 일치시킵니다 location
. 일치하는 *.fna 파일은 우리가 정의하는 함수의 이름으로 제공되는 표현식 한정자를 전달해야 합니다.