这可能是重复的在命令 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
答案1
在 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
}