簡體   English   中英

用於linux的Bash腳本創建5個新文件

[英]Bash script for linux to create 5 new files

我需要幫助來創建一個bash腳本。 我希望每次運行腳本時都會創建5個新文件。

我嘗試了一個像這樣的基本for循環:

#!/bin/bash

for i in {0..5}
do
  touch File${i}
done

顯然,這只是創建了一個名為5個文件, File1File5 每次運行腳本時,我都需要它使用新名稱制作5個新文件。 在尋找什么方向的任何提示?

無需使用循環。 只需這樣做

touch File{1..5}  

每次根據范圍創建新文件

START=$(ls | wc -l)
END=$((START+1))
for((i=START;i<=END;i++)); do  
    touch File$i

這個答案是在明確名稱是連續的並且繼續上一次運行之前給出的。 我會讓它站起來而不是刪除它,因為它可能為其他未來的讀者提供信息。

mktemp怎么樣:

mktemp {a..e}XXXXXX

樣本輸出

aW1KLgp
bZrPq2I
c1BKn8i
dIjzxrc
ezpWkkO

這將為您提供一個以a開頭的文件,一個以b開頭,依此類推。

或者你可能更喜歡這個:

mktemp {1..5}-XXXXXX
1-00r8Gf
2-wjojeF
3-lPni6G
4-ihYrOP
5-B5YtEB

嘗試類似的東西:

#!/bin/bash

count=$(ls File* 2>/dev/null | wc -l)
for ((i=$count+1; i<=$count+5; i++)); do
    touch $(printf "File%03d" $i)
done

說明:

這里我假設文件以前綴“File”開頭。

count=$(ls ...)計算目錄中存在以“File”開頭的文件數。 2>/dev/null部分2>/dev/null用於在初始執行時沒有這樣的文件時抑制錯誤消息。 然后for循環相應地生成另外五個文件。 您可以修改%03d的數字,具體取決於您要生成的文件數量。

雖然其他一些建議使用ls piped to wc但這並不保證是正確的,請參閱此處。

相反,您可以獲得當前目錄中的文件數量:

files=( * )  
num_files=${#files[@]}  
if [[ $files=='*' ]]; then  
    touch File{000..004}
    exit
fi
for (( i=num_files; i<num_files+5; i++)); do  
    touch $( printf "File%03d" $i )
done

快速分解每個部分的作用:
files=( * )使用模式匹配來獲取當前目錄中的所有文件,即使它們包含換行符。 ( )表示從這些文件生成數組並將其分配給files

${#files[@]}將給出數組files的元素數量,即目錄中有多少文件。

if塊檢查files是否為litterally * ,這意味着沒有匹配的文件,也就是說你在一個空目錄中,在這種情況下它會為你創建前5個文件。 否則,您將迭代接下來的5個文件編號。

touch $( printf "File$03d" $i )在子shell中執行printf ,它將返回名稱File后跟一個帶有前導零的3位數字,以便您的文件按照您的預期排序。

你的問題也是一個人; {0..5}給你六個數字,而不是五個。

希望這可以幫助!

編輯0:

正如Mark在下面所說,使用shopt -s nullglob將導致通配符在沒有匹配任何文件時返回任何內容,這是此處所需的行為。

這是更新的解決方案:

shopt -s nullglob  
files=( * )  
num_files=${#files[@]}  
for (( i=num_files; i<num_files+5; i++)); do  
    touch $( printf "File%03d" $i )
done

暫無
暫無

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

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