我完成了一个脚本,为给定目录中的所有文件添加和删除10位数字前缀。如果我应用前缀,则ls /home/testing | cut -c1-10 | uniq
返回1个单值 - 前缀。
如何在删除前缀的脚本的一部分中放置验证,仅在文件名中包含10位数前缀时删除前缀?否则,如果某个地方出错,我可以从文件名中删除前10个字符。
答案 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提供的工具,而不是产生调用第三方工具(如grep
和cut
)的子shell。 参数扩展/替换和子字符串提取通常可以处理所有字符串解析需求,而不会产生单个子shell。对grep
和cut
等外部应用程序的每次调用都会产生自己的子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