如何在删除之前检查文件是否具有正确的前缀

时间:2014-11-16 22:23:03

标签: linux bash

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

如何在删除前缀的脚本的一部分中放置验证,仅在文件名中包含10位数前缀时删除前缀?否则,如果某个地方出错,我可以从文件名中删除前10个字符。

3 个答案:

答案 0 :(得分:1)

您可以使用字符类字符串索引,轻松地从文件名中删除10 digit prefix

#!/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

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

答案 1 :(得分:0)

如果你想检查文件的长度以检查它是否足够长 - 在$ {#f}下面的eaxmple中返回$ f的长度。

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

答案 2 :(得分:0)

这将回显以至少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