Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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
Linux 如何在删除文件之前检查其前缀是否正确_Linux_Bash - Fatal编程技术网

Linux 如何在删除文件之前检查其前缀是否正确

Linux 如何在删除文件之前检查其前缀是否正确,linux,bash,Linux,Bash,我完成了一个脚本,为给定目录中的所有文件添加和删除10位前缀。如果我应用前缀,则ls/home/testing | cut-c1-10 | uniq返回1个单一值-前缀 如何在脚本中删除前缀的部分进行验证,仅在文件名中包含10位前缀时才删除前缀?否则,如果某个地方出了问题,我可以从文件名中删掉前10个字符。如果您想检查文件的长度以检查它是否足够长-在下面的EAX示例中${f}返回$f的长度 f=/home/testing if [[ ${#f} -ge 10 ]];then echo $f

我完成了一个脚本,为给定目录中的所有文件添加和删除10位前缀。如果我应用前缀,则
ls/home/testing | cut-c1-10 | uniq
返回1个单一值-前缀


如何在脚本中删除前缀的部分进行验证,仅在文件名中包含10位前缀时才删除前缀?否则,如果某个地方出了问题,我可以从文件名中删掉前10个字符。

如果您想检查文件的长度以检查它是否足够长-在下面的EAX示例中${f}返回$f的长度

f=/home/testing
if [[ ${#f} -ge 10 ]];then
   echo $f | cut -c1-10
fi

这将回显以至少10位十进制数字开头的文件名

for file in $(ls [0-9]*|grep "^[0-9]\{10\}"); do
    echo file=${file}
done
这将回显具有相同10位前缀的文件计数、前缀以及与该前缀匹配的每个文件

ls [0-9]* | grep "^[0-9]\{10\}" | cut -c1-10 | sort | uniq -c | while read count prefix; do
    echo count=$count prefix=$prefix $(ls ${prefix}*)
done

使用字符类字符串索引,您可以非常轻松地从文件名中删除
10位前缀

#!/bin/bash

for i in "$1"/*; do

    fname=${i##*/}                               # separate filename from path
    [[ "${fname:0:10}" =~ [^0-9] ]] && continue  # skip if not 10 digit-prefix
    prefix=${fname:0:10}                         # get the prefix
    noprefix=${fname:10}                         # remove the prefix from beginning
    echo "$fname  =>  $noprefix"                 # do whatever with remaining fname
    # if [ "$prefix" = "$testvalue" ]; then      # validate correct prefix
    #     do something
    # fi

done
输入:

$ ls -l dat/tmp
total 40
drwxr-xr-x 2 david david 4096 Aug 25 17:06 a
drwxr-xr-x 2 david david 4096 Jun 27 02:31 b
drwxr-xr-x 2 david david 4096 Jun 27 02:30 c
drwxr-xr-x 2 david david 4096 Jun 27 02:30 d
drwxr-xr-x 2 david david 4096 Nov  6 23:46 jpg
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567890_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567891_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567892_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567893_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567894_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567895_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567896_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567897_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567898_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567899_file.txt
-rw-r--r-- 1 david david  139 Sep 23 15:57 file.back.1411505860
-rw-r--r-- 1 david david  139 Sep 23 15:58 file.back.1411505898
-rw-r--r-- 1 david david  189 Sep 27 11:37 nginx.conf
-rw-r--r-- 1 david david  115 Sep 27 11:36 nginx.conf.bak
-rw-r--r-- 1 david david  139 Aug 25 16:18 nm.txt
$ bash tendigits.sh dat/tmp
1234567890_file.txt  =>  _file.txt
1234567891_file.txt  =>  _file.txt
1234567892_file.txt  =>  _file.txt
1234567893_file.txt  =>  _file.txt
1234567894_file.txt  =>  _file.txt
1234567895_file.txt  =>  _file.txt
1234567896_file.txt  =>  _file.txt
1234567897_file.txt  =>  _file.txt
1234567898_file.txt  =>  _file.txt
1234567899_file.txt  =>  _file.txt
输出:

$ ls -l dat/tmp
total 40
drwxr-xr-x 2 david david 4096 Aug 25 17:06 a
drwxr-xr-x 2 david david 4096 Jun 27 02:31 b
drwxr-xr-x 2 david david 4096 Jun 27 02:30 c
drwxr-xr-x 2 david david 4096 Jun 27 02:30 d
drwxr-xr-x 2 david david 4096 Nov  6 23:46 jpg
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567890_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567891_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567892_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567893_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567894_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567895_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567896_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567897_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567898_file.txt
-rw-r--r-- 1 david david    0 Nov 16 20:03 1234567899_file.txt
-rw-r--r-- 1 david david  139 Sep 23 15:57 file.back.1411505860
-rw-r--r-- 1 david david  139 Sep 23 15:58 file.back.1411505898
-rw-r--r-- 1 david david  189 Sep 27 11:37 nginx.conf
-rw-r--r-- 1 david david  115 Sep 27 11:36 nginx.conf.bak
-rw-r--r-- 1 david david  139 Aug 25 16:18 nm.txt
$ bash tendigits.sh dat/tmp
1234567890_file.txt  =>  _file.txt
1234567891_file.txt  =>  _file.txt
1234567892_file.txt  =>  _file.txt
1234567893_file.txt  =>  _file.txt
1234567894_file.txt  =>  _file.txt
1234567895_file.txt  =>  _file.txt
1234567896_file.txt  =>  _file.txt
1234567897_file.txt  =>  _file.txt
1234567898_file.txt  =>  _file.txt
1234567899_file.txt  =>  _file.txt

在bash中工作时,通常更高效、更适合使用bash提供的工具,而不是生成调用第三方工具的子shell,如
grep
cut
参数扩展/替换子字符串提取通常可以处理所有字符串解析需求,而无需生成单个子shell。对外部应用程序的每次调用,如
grep
cut
都会产生自己的子shell和进程。(值得思考)

我的意思是检查所有文件的前缀是否为10位数字。如果ls/home/testing | cut-c1-10 | uniq返回多个答案,则有些地方不正确。