(背景信息)
编写我的第一个bash psuedo程序。该程序从网络下载一堆文件,将它们存储在名为./network-files/
的子目录中,然后删除它下载的所有文件。它还将结果记录到./logs/
中的多个日志文件中。
我想记录每个已删除文件的文件名。
目前,我正在这样做:
echo -e "$(date -u) >>> Removing files: $(ls -1 "$base_directory"/network-files/* | tr '\n' ' ')" | tee -a $network_files_log $verbose_log $network_log
($base_directory
是定义应用程序基本目录的变量,$network_files_log
等是定义各种日志文件位置的变量)
这会产生一些非常好的结果和不可读的输出:
Tue Jun 21 04:55:46 UTC 2016 >>> Removing files: /home/vagrant/load-simulator/network-files/207822218.png /home/vagrant/load-simulator/network-files/217311040.png /home/vagrant/load-simulator/network-files/442119100.png /home/vagrant/load-simulator/network-files/464324101.png /home/vagrant/load-simulator/network-files/525787337.png /home/vagrant/load-simulator/network-files/581100197.png /home/vagrant/load-simulator/network-files/640387393.png /home/vagrant/load-simulator/network-files/650797708.png /home/vagrant/load-simulator/network-files/827538696.png /home/vagrant/load-simulator/network-files/833069509.png /home/vagrant/load-simulator/network-files/8580204.png /home/vagrant/load-simulator/network-files/858174053.png /home/vagrant/load-simulator/network-files/998266826.png
从这些文件路径中删除/home/vagrant/load-simulator/network-files/
部分的好方法吗?我怀疑我应该使用sed
或{grep
或{ {1}},但到目前为止还没有运气。
答案 0 :(得分:2)
您也可以考虑使用find。它非常适合步行目录,删除文件和使用自定义 printf 输出:
find $PWD/x -type f -printf "%f\n" -delete >>$YourLogFile.log
答案 1 :(得分:2)
根本不要使用ls
;使用glob用所需文件填充数组。然后,您可以使用参数扩展来缩短每个数组元素。
d=$base_directory/network-files
files=( "$d"/* )
printf '%s Removing files: %s' "$(date -u)" "${files[*]#$d/}" | tee ...
答案 2 :(得分:1)
testdata="/home/vagrant/load-simulator/network-files/207822218.png /home/vagrant/load-simulator/network-files/217311040.png"
echo -e $testdata | sed -e 's/\/[^ ]*\///g'
管道你的输出sed替换捕获的组没有任何东西。
正则表达式:\/[^ ]*\/
从/
开始,捕获所有不是空格的内容,直到它到达最后/
。
答案 3 :(得分:1)
你可以通过几种方式做到这一点。要直接回答这个问题,您可以使用sed
来执行替换命令,如:
echo -e "$(date -u) >>> Removing files: $(ls -1 "$base_directory"/network-files/* | tr '\n' ' ')" | sed -e "s,$base_directory/network-files/,," | tee -a $network_files_log $verbose_log $network_log
将sed -e "s,$base_directory/network-files/,,"
添加到管道中。只要base_directory
中没有逗号,它就会用空字符串替换base_directory
中的字符串。如果有,你可以为sed命令的各个部分尝试不同的分隔符,如下划线:sed -e "s_$base_directory/network-files__"
相反,您可以将子shell cd
放到该目录中,然后字符串就不会出现在那里:
echo -e "$(date -u) >>> Removing files: $(cd "$base_directory/network-files/"; ls -1 | tr '\n' ' ')" | tee -a "$network_files_log" "$verbose_log" "$network_log"
或者你可以通过echo
and use printf
来避免一些潜在的陷阱
{ printf '%s >>>Removing files: '; printf '%s ' "$(cd "$base_directory/network-files"; ls -1)"; printf '\n'; } | tee -a ...