ren
跳转到导航
跳转到搜索
A Linux bash script emulating the DOS command ren.
ren
#!/bin/bash
if [ "$#" -lt 1 ]; then
exit 1
fi
if [ "$#" -eq 1 ]; then
shopt -s nullglob
IFS=$'\n'
fs=( $1 )
for f in "${fs[@]}"; do
if [ -f "$f" ]; then
d=$(dirname "$f")
b=$(basename "$f")
bs="${b%.*}"
nf="$d/$bs"
mv -- "$f" "$nf"
fi
done
IFS=' '
shopt -u nullglob
else
tg="${@: -1}"
sc=( "${@:1:$(($#-1))}" )
if [[ "$tg" == *'*'* ]]; then
shopt -s nullglob
IFS=$'\n'
for p in "${sc[@]}"; do
fs=( $p )
for f in "${fs[@]}"; do
if [ -f "$f" ]; then
d=$(dirname "$f")
b=$(basename "$f")
bs="${b%.*}"
nf="$d/${tg/\*/$bs}"
mv -- "$f" "$nf"
fi
done
done
IFS=' '
shopt -u nullglob
else
if [ "${#sc[@]}" -ne 1 ]; then
exit 1
fi
f="${sc[0]}"
d=$(dirname "$f")
nf="$d/$tg"
mv -- "$f" "$nf"
fi
fi
A zsh diversion
(Translated by Grok, not fully tested, should be fine.)
ren
#!/bin/zsh
if [[ $# -lt 1 ]]; then
exit 1
fi
if [[ $# -eq 1 ]]; then
setopt NULL_GLOB
local -a fs
fs=( ${(f)1} )
for f in "${fs[@]}"; do
if [[ -f "$f" ]]; then
d=$(dirname "$f")
b=$(basename "$f")
bs="${b:r}"
nf="$d/$bs"
mv -- "$f" "$nf"
fi
done
unsetopt NULL_GLOB
else
tg="${@[-1]}"
local -a sc
sc=( "${@[1,-2]}" )
if [[ "$tg" == *'*'* ]]; then
setopt NULL_GLOB
for p in "${sc[@]}"; do
local -a fs
fs=( ${(f)p} )
for f in "${fs[@]}"; do
if [[ -f "$f" ]]; then
d=$(dirname "$f")
b=$(basename "$f")
bs="${b:r}"
nf="$d/${tg/\*/$bs}"
mv -- "$f" "$nf"
fi
done
done
unsetopt NULL_GLOB
else
if [[ "${#sc[@]}" -ne 1 ]]; then
exit 1
fi
f="${sc[1]}"
d=$(dirname "$f")
nf="$d/$tg"
mv -- "$f" "$nf"
fi
fi