Bash 如何从具有x位数字前缀的文件名中删除前缀
在社区的帮助下,我将以下脚本放在一起,为所有文件添加x位随机前缀。问题是,有时我需要添加一个新文件,而这正是我的脚本遇到问题的时候Bash 如何从具有x位数字前缀的文件名中删除前缀,bash,if-statement,Bash,If Statement,在社区的帮助下,我将以下脚本放在一起,为所有文件添加x位随机前缀。问题是,有时我需要添加一个新文件,而这正是我的脚本遇到问题的时候 #!/bin/bash # validate input [ -n "$1" ] || { printf "error: insufficient input. Usage: %s /path/to/files\n" "${0//\//}" exit 1 } # validate directory [ -d "$1" ] || { pr
#!/bin/bash
# validate input
[ -n "$1" ] || {
printf "error: insufficient input. Usage: %s /path/to/files\n" "${0//\//}"
exit 1
}
# validate directory
[ -d "$1" ] || {
printf "error: directory not found: '%s'\n" "$1"
exit 1
}
path="$1"
## removing prefix
count=$(ls $path | cut -c1-10 | uniq | wc -l)
echo $count
echo $path
if [ $count = "1" ]
then
cd $path
for i in *; do mv "$i" `echo $i|cut -c11-`; done
echo "PREFIXES REMOVED"
else
echo "PREFIXES ARE NOT UNIQUE, SKIPPING"
fi
mask=$RANDOM$RANDOM$RANDOM; let "mask %= 10000000000";
len=$(echo ${#mask})
## Note: this assumes you are exporting mask earlier. If not, set mask here
## add validation for length 10
if [ $len -lt 10 ]; then
echo "mask is not 10" >&2
exit 1
fi
# move files
prefixcheck=$(ls $path | cut -c1-10 | uniq | wc -l)
if [ $prefixcheck != 1 ]
then
for i in "${path}"/*; do
[ -f "$i" ] || continue # if not file, skip
dir="${i%/*}" # path component
ffname="${i##*/}" # full filename component (with .ext)
mv "$i" "${dir}/${mask}${ffname}"
echo $mask " applied at " $(date) "in " $path >> /home/newprefix
done
else
echo "prefixes exist, skipping"
fi
假设我有20个带前缀的文件,我在文件夹中放入了一个新文件recording001.mp4,那么我的脚本将失败。如何告诉它从文件名中的字符1-10为数字的所有文件中删除前缀?要从文件名中删除10位前缀:
cd "$path" &&
for i in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*
do
mv "$i" "${i#??????????}"
done
我猜您的脚本失败是因为您首先从每个文件名中删除了前缀(第一个
for
循环)。。。包括新文件的名称,即新文件recording001.mp4
将重命名为01.mp4
cd“$path”&用于[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*中的i;做mv“$i”“${i#?????”;done
${i#?}
表示删除第一个字符的变量i
的值。例如,如果i=example
${i#?}
将是example
,${i#?}
将是sample
,依此类推。。。在此阅读关于${parameter#word}
的说明。