Bash:从`ls`到`tee`进行管道时过滤目录

时间:2016-06-22 18:20:45

标签: bash sed grep

(背景信息)

编写我的第一个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}},但到目前为止还没有运气。

4 个答案:

答案 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 ...