Bash
如何自動創建文件?
我正在嘗試創建一個腳本,它可以:
- 查找包含“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 中的內容\( \)
,\2
for 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
/bash
where 數組並不是真正獨特的類型,你需要${#array[@]}
它作為${#array}
索引 0 元素的長度(以字元數計)。(N)
: glob 限定符,表示如果沒有匹配則擴展為空$f
,$files
: 與其他類似 Bourne 的 shell 不同,變數不需要被引用(只要它們不包含空值)。在其他 shell(ksh、bash、yash)中,您需要"$f"
和"${files[@]}"
.