Shell-Script
如何復製文件 n 次,然後在 .zshrc 中創建一個函式?
這可能是命令 shell 中重複文件 x 次的副本,並且絕對是如何在每個文件中嵌入索引時多次復製文件的副本,但發布答案的人最後一次出現在 2017 年,我想知道如何在 zsh 中將其用作函式,以便可以在具有任何副檔名的文件(不僅僅是 txt 文件)上呼叫它,如下所示:要製作的副本數
cpx file.ext n
在哪裡。n
另外,我如何分隔文件名和文件副檔名。這只是 txt 文件的答案:
#!/bin/sh orig=ascdrg3.txt # start with this file in=$orig count=1 #loop variable max=5 #number of files to create while test "$count" -le "$max" ; do # Remove extension base=$(basename "$in" .txt) # get the prefix prefix=$(expr substr "$base" 1 $((${#base}-1))) # get last letter last=$(expr substr "$base" ${#base} 1) while true ; do # Advance letter, while the file doesn't exist last=$(echo "$last" | tr A-Z B-ZA) last=$(echo "$last" | tr a-z b-za) last=$(echo "$last" | tr 0-9 1-90) # construct new file name new="$prefix$last.txt" # continue if it doesn't exist # (otherwise, advance the last letter and try again) test -e "$new" || break test "$new" = "$orig" \ && { echo "error: looped back to original file" >&2 ; exit 1; } done # Create new file cp "$orig" "$new" # Modify first line of new file sed -i "1s/\$/number($count,$max)/" "$new" # Advance counter count=$((count+1)) # loop again in=$new done
有沒有更小的方法可以做到這一點?
我想要的是:
cpx hello.py 3
應該創建hello1.py hello2.py hello3.py
絕對有一種更簡單的方法可以在 zsh 中穩健地執行此操作。還有一種更簡單的方法可以在普通 sh 中穩健地執行此操作:這個腳本過於復雜和脆弱(假設所有文件名都有副檔名,在沒有提示的情況下覆蓋文件,……)。由於這個執行緒是關於 zsh 的,我將利用 zsh 的功能。
歷史和參數擴展修飾符
r
對於在基本名稱和e
副檔名之間拆分文件名很有用。但是,請注意,它們僅在文件確實具有副檔名時才有效。警告:未經測試的程式碼。
function cpx { if (($# != 2)); then cat >&2 <<EOF Usage: cpx FILENAME N Make N copies of FILENAME. EOF return 1 fi local n=$2 if [[ $n != <-> ]]; then print -ru2 "cpx: $n: not a number" return 1 fi local prefix=$1 suffix= i # If there is an extension, put the number before the extension if [[ $prefix:t == ?*.* ]]; then prefix=$1:r suffix=.$1:e fi # If the part before the number ends with a digit, separate the additional # number with a dash. if [[ $prefix == *[0-9] ]]; then prefix+="-" fi # Copy foo.bar to foo1.bar, foo2.bar, ... for ((i=1; i<=n; i++)); do cp -p -i -- $1 $prefix$i$suffix done }