Bash

如何自動創建文件?

  • March 21, 2016

我正在嘗試創建一個腳本,它可以:

  • 查找包含“foobar”作為名稱的文件
  • 對此文件執行腳本,並且輸出必須儲存在一個新的 CSV 文件中,該文件是自動創建的,並且與搜尋的文件同名。唯一的區別是副檔名更改為 CSV。

這是我的腳本。:

#!/bin/bash

# search for file containing "foobar" as a name in the directory
for file in /home/user/Documents/* ;
do 

if [[ "$file" == *"$foobar"* ]]; then
touch  /home/user/Documents/collectCSV/csv1.csv
# executing script of modelising foobar file ==> extract some data from $foobar file and insert it in the
# created file csv1.csv
/home/user/scriptModelise.pl  $file >> /home/user/Documents/collectCSV/csv1.csv


else 
echo "foobar file not found" 
fi

done

問題是這種創建文件的方法是靜態的。我沒有成功地自動創建文件。我的意思是當它找到一個 foobar 文件時,它將被建模在一個將要創建的新文件中。

請問有什麼幫助嗎?

嘗試

for file in *"$foobar"*
do
  dest="$(echo $file| sed -e 's/\(.*\)\.[^\.]*$/\1.csv/' )"
  if test -f "$file" 
  then 
      /home/user/scriptModelise.pl  "$file" >> /home/user/Documents/collectCSV/$dest
  else
    echo "no $foobar file"
  fi
done

在哪裡

  • \(.*\)\.[^\.]*$使用任何字元擷取模式,(模式結束)後跟一個點,非點直到行尾
  • \1.csv找到插入模式,添加 .csv
  • *"$foobar"*``*foobar*如果找不到匹配的文件,將擴展為 litteral (具有適當的值)。因此需要test -f "$file"

編輯:

  • \(.*\)\.[^\.]*$ (左側:尋找模式)

分成(_是佔位符)

  • __.*__________具有任何字元的模式(點具有特殊含義:任何字元)
  • __.*__\._______ 帶有任何字元的模式,後跟一個點(轉義點是普通點)
  • __.*__\.[^\.]*$帶有任何字元的模式,(模式結束)後跟一個點,非點 ( [^\.]*) 直到行尾(美元符號對於行尾是特殊的)
  • \(__\)__________擷取模式的第一部分。
  • \1.csv(右手邊,做什麼)
  • \1____ \1匹配 first 中的內容\( \)\2for second 等等,&用於整個模式。

更容易zsh(請注意,zsh當您像這樣不引用變數時,您已經在使用語法):

#! /bin/zsh -
files=(/home/user/Documents/*foobar*(N))
if (($#files)) {
 ret=0
 for f ($files) {
   /home/user/scriptModelise.pl $f > $f:h/collectCSV/$f:t:r.csv || ret=$?
 }
 exit $ret
} else {
 echo >&2 No non-hidden foobar file
 exit 1
}
  • 像 in 一樣csh$f:h是頭部(dirname)、$f:t尾部(basename)、$f:r根(已刪除副檔名)。
  • ((arithmetic expression))like inksh計算算術表達式,如果它解析為非零值,則返回 true。
  • $#array, 讓人想起ksh’s${#string}以元素數量給出數組的長度。在ksh/ bashwhere 數組並不是真正獨特的類型,你需要${#array[@]}它作為${#array}索引 0 元素的長度(以字元數計)。
  • (N): glob 限定符,表示如果沒有匹配則擴展為空
  • $f, $files: 與其他類似 Bourne 的 shell 不同,變數不需要被引用(只要它們不包含空值)。在其他 shell(ksh、bash、yash)中,您需要"$f""${files[@]}".

引用自:https://unix.stackexchange.com/questions/270146