[英]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
文件
我贊賞您使用您熟悉的工具的機智,但是您使用find
和awk
命令做了很多工作,而這些命令可以通過純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
標志測試是否存在常規文件,並且!
否定它(因此測試是否缺少常規文件)。在 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.