簡體   English   中英

如何在 bash 中使用 if not 條件打印文件

[英]How to print out files using if not condition in bash

假設我在目錄dir有三個文件

touch a.ym b.ym a.job 

如果沒有相應的*.job文件,我需要打印所有*.ym 所以這是我嘗試的,

for file in $(find ${dir} -name \*.ym);do
    filebase=$(basename $file)
    sample_id=$(echo "${filebase}"| awk -F'[.]' '{print $1}')
    if  [[ $sample_id != *".job" ]]; then
          echo "${file}"
    fi
done

但是,上述解決方案同時打印出

a.ym b.ym文件,我只需要打印出b.ym文件

我贊賞您使用您熟悉的工具的機智,但是您使用findawk命令做了很多工作,而這些命令可以通過純bash更輕松地完成。

嘗試這個:

回答

for ym_file in "${dir}"/*.ym; do
    job_file="${ym_file/.ym/.job}"
    if [[ ! -f "$job_file" ]]; then
        echo "${ym_file} has no matching job file"
    fi
done

解釋

  • "${dir}"/*.ym :您可以直接在 bash 中使用 glob 匹配。 如果您沒有任何.ym文件,這會出錯,但在這種情況下它不會做任何壞事。
  • "${ym_file/.ym/.job}" :這是一個bash模式替換。 它將.ym所有實例替換為.job 我假設這些模式不會出現在您的文件名中,除非出現在末尾。
  • [[ ! -f "$job_file" ]] [[ ! -f "$job_file" ]]-f標志測試是否存在常規文件,並且! 否定它(因此測試是否缺少常規文件)。

cf 內置工具的Bash 參數擴展條件表達式

for f in *.ym
do [[ -e "${f%.ym}.job" ]] || echo "$f"
done

在 Bash 中:

為了確保使用bash解釋器運行可執行腳本,確保腳本中的第一個字符是#! ,后跟一個將調用bash的命令。 第一行的示例是:

#!/bin/bash

通常,不匹配任何內容的 glob 模式的擴展將導致原始的 globbing 模式。 這在我們的情況下是不希望的。 為了使不匹配的 glob 評估為空文件列表,需要啟用nullglob選項,如下所示:

shopt -s nullglob

以下表達式的計算結果為目錄$dir名稱以.ym結尾的文件列表:

"$dir"/*.ym

以下計算為文件的文件名前綴$file

"${file%.*}"

檢查文件是否不存在的條件是:

if [[ ! -f "${file}" ]]; then
  ... the file does not exist ...
fi

結合這些點會產生以下腳本:

#!/bin/bash

shopt -s nullglob

for file in "$dir"/*.ym; do
  if [[ ! -f "${file%.*}.job" ]]; then
    echo "$file"
  fi
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM