ren

来自Tsetien’s Wiki
跳转到导航 跳转到搜索

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