將包含模式的檔案移動一定次數

將包含模式的檔案移動一定次數

我有很多文件(帶有.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 及其表達式作為全域限定符選擇只有九個這樣的符號的文件:

$ hasnine() { [[ $(tr -dc '>' < "$REPLY" | wc -c) -eq 9 ]]; }
$ mv *.fna(+hasnine) location/

第一行定義了一個函數,其目的是為包含九個>符號的檔案建立真/假過濾器。此tr指令對其輸入進行操作(預期在變數中)REPLY,刪除所有不是 a 的內容>,然後要求wc計算結果字元的數量,然後將該輸出與 9 進行比較。

第二行執行mv將 *.fna 檔案配對到(範例)location目錄的命令。匹配 *.fna 檔案也必須傳遞表達式限定符,該限定符會作為我們定義的函數的名稱給出。

相關內容