Linux 如何在删除文件之前检查其前缀是否正确
我完成了一个脚本,为给定目录中的所有文件添加和删除10位前缀。如果我应用前缀,则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
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返回多个答案,则有些地方不正确。