Shell-Script

如何復製文件 n 次,然後在 .zshrc 中創建一個函式?

  • April 5, 2021

這可能是命令 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
}

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