패턴이 포함된 파일을 일정 횟수만큼 이동합니다.

패턴이 포함된 파일을 일정 횟수만큼 이동합니다.

(확장자 포함) 파일이 많습니다 .fna. 문자가 포함된 경우 이동해야 합니다.>특정 횟수.

어떤 파일이 포함되어 있는지 알고 있습니다.>이 명령을 특정 횟수만큼 사용하십시오(이 예에서는 9회).

grep -c ">" *.fna | grep ":9"

이것은 다음과 같은 출력을 제공합니다

5242_ref.fna:9
9418_ref.fna:9

그런데 이 파일을 다른 폴더로 옮기는 방법을 모르겠습니다.

감사해요.

답변1

( 양수 일치가 파일 이름만 반환하도록 egrep옵션으로 호출 )을 다음과 결합하여-lxargs텍스트 일치를 기반으로 임의 명령을 실행할 수 있습니다.

[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명령은 입력(변수에 예상됨)에 대해 작동하고 REPLYa가 아닌 모든 항목을 제거한 다음 결과의 문자 수를 계산 >하도록 요청한 다음 해당 출력을 9와 비교합니다.wc

두 번째 줄은 명령을 실행하여 mv*.fna 파일을 (예제) 디렉터리와 일치시킵니다 location. 일치하는 *.fna 파일은 우리가 정의하는 함수의 이름으로 제공되는 표현식 한정자를 전달해야 합니다.

관련 정보