【问题标题】:Change file's numbers Bash更改文件的编号 Bash
【发布时间】:2018-10-02 18:27:50
【问题描述】:

我需要实现一个脚本 (duplq.sh),该脚本将使用命令行参数重命名当前目录中存在的所有文本文件。所以如果duplq.sh pic 0 3这个命令被执行了,它会做如下的转换:

pic0.txt 必须重命名为 pic3.txt

pic1.txtpic4.txt

pic2.txtpic5.txt

pic3.txtpic6.txt

等等……

所以第一个参数总是文件名,第二个和第三个总是一个正数。

我还需要确保在执行脚本时,第一次重命名(pic0.txt 到 pic3.txt)不会擦除当前目录中现有的 pic3.txt 文件。

这是我到目前为止所做的:

 #!/bin/bash

name="$1"
i="$2"
j="$3"


for file in $name*
do
    echo $file
    find /var/log -name 'name[$i]' | sed -e 's/$i/$j/g'
    i=$(($i+1))
    j=$(($j+1))
done 

但是 find 命令似乎不起作用。您还有其他解决方案吗?

【问题讨论】:

标签: linux bash shell rename


【解决方案1】:

一个可能的解决方案...

#!/bin/sh

NUMBERS=$(ls $1|sed -e 's/pic//g' -e 's/\.txt//g'|sort -n -r)

for N in $NUMBERS
do
    NEW=$(($N + 3))
    echo "pic$N.txt -> pic$NEW.txt"
    mv "pic$N.txt" "pic$NEW.txt"
done

【讨论】:

  • 在这种情况下,您假设参数中的第一个数字为零,第二个数字为 3。但它必须适用于任何参数。此外,第二个参数不一定优于第一个参数,因此添加不起作用。
  • 好的,从你给出的描述中看不太清楚。现在我明白了:)
  • why you shouldn't parse the output of ls。同样,Don't Read Lines With forls $1 中缺少引号也意味着如果给定带有空格的目录名称,这将不起作用。
  • @CharlesDuffy 你有解决办法吗?
  • 如果问题能更好地说明我可能会,但不清楚 OP 想要什么,我也没有兴趣猜测他们的意图。
【解决方案2】:

find可能的文件,sort按编号命名,使用sed删除编号小于$1的文件,按编号反转sort,并从顶部开始从最高编号向下重命名到最低:

#!/bin/sh
find . -maxdepth 1 -type f -name "$1"'[0-9]*' | 
sort -g | sed -n "/^$1$2."'/,$p' | sort -gr | 
while read x ; do
    p="${x%%[0-9]*.*}"; s="${x##*[0-9]}" ; i="${x%$s}" i="${i#$p}"
    mv "$x" "$p$((i+$3))$s"
done 

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 2020-03-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多