Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 根据名称中的数值对文件列表进行排序_Bash_Sorting - Fatal编程技术网

Bash 根据名称中的数值对文件列表进行排序

Bash 根据名称中的数值对文件列表进行排序,bash,sorting,Bash,Sorting,我有这个文件列表,我想对它们进行排序,并将它们的名称增加一个整数值,我的代码工作正常,直到列表达到10。然后,linux“sort”命令解释“10”中的第一个“1”,并认为它比9小。有什么办法可以让这一切顺利进行吗 这是我编写的代码,用于循环文件夹和增量文件名: #!/bin/bash #set -x ROOT=~/testing/ FILE_COUNT=$(ls -1 $ROOT | wc -l | awk '{print $1}') COUNT=5 if [[ ${FILE_COUNT}

我有这个文件列表,我想对它们进行排序,并将它们的名称增加一个整数值,我的代码工作正常,直到列表达到10。然后,linux“sort”命令解释“10”中的第一个“1”,并认为它比9小。有什么办法可以让这一切顺利进行吗

这是我编写的代码,用于循环文件夹和增量文件名:

#!/bin/bash

#set -x
ROOT=~/testing/
FILE_COUNT=$(ls -1 $ROOT | wc -l | awk '{print $1}')
COUNT=5

if [[ ${FILE_COUNT} -eq $COUNT ]]; then
    echo $COUNT backup files are there

    FILE_LIST=$(ls -1 $ROOT | sort -n -r)

    for file in $FILE_LIST; do
        echo $file
        file_new=`basename $file .zip`
        if [[ -e $ROOT$file ]]; then
            #mv $ROOT$file $ROOT${file_new%?}$COUNT.zip
            FILENUM=${file_new:${#file_new}-1}
            #echo "This is file # $FILENUM" next one is $(( FILENUM + 1 ))
            echo mv $ROOT$file $ROOT${file_new%?}$(( FILENUM + 1 )).zip
            mv $ROOT$file $ROOT${file_new%?}$(( FILENUM + 1 )).zip
        fi
        ((COUNT--))
    done
else
    echo Not $COUNT files, there are $FILE_COUNT
    COUNT=$FILE_COUNT
fi
这些是排序行的结果:

macbookair:~ ilium007$ ls -l testing/ | sort -n -r -t "_"
total 40
-rw-r--r--  1 ilium007  staff  15 16 Nov 21:24 backup_9.zip
-rw-r--r--  1 ilium007  staff  15 16 Nov 21:24 backup_8.zip
-rw-r--r--  1 ilium007  staff  15 16 Nov 21:24 backup_7.zip
-rw-r--r--  1 ilium007  staff  15 16 Nov 21:24 backup_6.zip
-rw-r--r--  1 ilium007  staff  15 16 Nov 21:24 backup_10.zip
如何创建此文件列表:

backup_10.zip
backup_9.zip
backup_8.zip
backup_7.zip
backup_6.zip

非常感谢您的帮助。

您需要指定排序键,在本例中为
-k2

ls | sort -n -r -t "_" -k2

该代码最终起作用:

#!/bin/bash

set -x
ROOT=~/testing/
FILE_COUNT=$(ls -1 $ROOT | wc -l | awk '{print $1}')
COUNT=5
FILENAME=("backup_19.zip"
"backup_2.zip
"backup_29.zip
"backup_38.zip")
for i in ${FILENAME[@]}; do
BASE_FILE_NAME=`basename $i .zip`
FILENUM=${BASE_FILE_NAME##*_}
NEW_FILE_NUM=$(( FILENUM + 1 ))
NEW_FILE_SUFFIX=$(( FILENUM + 1 )).zip
TEST=${BASE_FILE_NAME%%_*}_${NEW_FILE_SUFFIX}
done
exit

在我20岁之前,它一直工作得很好!backup_19.zip mv/Users/ilium007/testing/backup_19.zip/Users/ilium007/testing/backup_110.zip`我的代码是:
FILE_LIST=$(ls-1$ROOT | sort-n-r-t“u”-k2)
,与排序无关。您没有正确增加文件。这就是为什么备份_19变成备份_110的原因。这就是问题所在。
FILENUM=${file\u new:${file\u new}-1}
。改用这个:
FILENUM=${file\u new##*.}
我现在就快到了!我有一句话现在引起了一些问题:
echo mv$ROOT$file$ROOT${file_new%?}$((FILENUM+1)).zip
它只去掉一个字符,所以当我从19到20时,我仍然得到120个。将
${file_new%?}
更改为
${file_new%.*}