Ubuntu Shell脚本记录某些文件类型所在的位置

时间:2016-11-26 00:42:11

标签: bash shell unix scripting

我试图在Ubuntu中创建一个shell脚本,它将删除所有媒体文件并记录它们所在的位置。到目前为止,这是我的删除脚本部分:

sudo find / -name '*.mp3' -type f -delete
sudo find / -name '*.mov' -type f -delete
sudo find / -name '*.mp4' -type f -delete
sudo find / -name '*.avi' -type f -delete
sudo find / -name '*.mpg' -type f -delete
sudo find / -name '*.mpeg' -type f -delete
sudo find / -name '*.flac' -type f -delete
sudo find / -name '*.m4a' -type f -delete
sudo find / -name '*.flv' -type f -delete
sudo find / -name '*.ogg' -type f -delete
sudo find /home -name '*.gif' -type f -delete
sudo find /home -name '*.png' -type f -delete
sudo find /home -name '*.jpg' -type f -delete
sudo find /home -name '*.jpeg' -type f -delete

这是我的日志文件创建者:

#!/bin/bash
#Creating a log file for contraband media files
echo "Creating Log file in Documents folder for Illicit Media Files."
touch newfile ./Documents/Illicitmedia.txt

然而,这两项工作,我想要做的是让第一个程序找到任何媒体文件(被禁止)并将每个文件的文件位置回显到Illicitmedia.txt日志文件。

基本上:

  1. 我运行了一个在Illicitmedia.txt文件夹中创建./Documents的脚本。

  2. 我运行一个查找所有媒体文件的脚本,然后以下列格式将所有文件路径回显到日志文件:Illicit file found in: /home/user/Pictures/Photo.jpg

  3. 然后,在记录每个媒体文件后,我的其他脚本将通过并删除违禁品文件。

  4. 总而言之,我仍然需要帮助的唯一步骤是第2步。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

在这里,我刚刚为您展示了第一行概念,请将该概念应用于您的其余部分:

sudo find / -name \*.mp3 -type f -print >> /tmp/log && sudo find / -name \*.mp3 -type f -delete

您的日志将存储在/ tmp / log中,您可以将其复制到最后的任何位置。如果你真的需要日志的每一行说'"发现的非法文件:"在文件路径之前,然后在完成日志后运行以下命令:

sed -i -e 's/^/Illicit file found in: /' /tmp/log

答案 1 :(得分:1)

所有描述的操作都可以用两个find命令完成:

log='./Documents/Illicitmedia.txt'

sudo find / -type f \
  -regex '.*\(mp3\|mov\|mp4\|avi\|mpg\|mpeg\|flac\|m4a\|flv\|ogg\)$' \
  -exec printf "Illicit file found: %s\n" >> "$log" {} + \
  -exec rm {} +

sudo find /home -type f -regex '.*\.\(gif\|png\|jpg\|jpeg\)$' \
  -exec printf "Illicit file found: %s\n" >> "$log" {} + \
  -exec rm {} +

由于表达式rm {} +中的加号字符,命令行是通过在末尾附加每个选定的文件名来构建的,并且rm命令的调用总数将远远小于rm file1 file2 file3 #...命令的总数。匹配文件的数量:.*

正则表达式匹配任何字符($)后跟点和其中一个与alternation operator连接的扩展名。 -name字符是行尾的锚点。

使用 OR 运算符

顺便说一下,您可以使用 OR 运算符对sudo find / -type f \( \ -name '*.mp3' -o \ -name '*.mov' -o \ -name '*.mp4' -o \ -name '*.avi' -o \ -name '*.mpg' -o \ -name '*.mpeg' -o \ -name '*.flac' -o \ -name '*.m4a' -o \ -name '*.flv' -o \ -name '*.ogg' \ \) # ... 选项进行分组,如下所示:

find

备选方案:每个-exec

的单个Bash调用

可以将cmd='printf "Illicit file found: %s\n" "$0" "$@" >> "'"$log"'" && rm "$0" "$@"' sudo find / -type f \ -regex '.*\(mp3\|mov\|mp4\|avi\|mpg\|mpeg\|flac\|m4a\|flv\|ogg\)$' \ -exec bash -c "$cmd" {} + sudo find /home -type f -regex '.*\.\(gif\|png\|jpg\|jpeg\)' \ -exec bash -c "$cmd" {} + 加入单个Bash脚本:

$@

由于$0扩展到位置参数,从1开始,我们也需要传递-cfind选项的效果)。上面的printf 'Illicit file found: %s\n' testdir/x/y/z/file.mp3 testdir/a/b/two.mpeg testdir/a/b/c/one.mp3 testdir/a/one.avi testdir/a/one.mp4 testdir/a/x.flv rm testdir/x/y/z/file.mp3 testdir/a/b/two.mpeg testdir/a/b/c/one.mp3 testdir/a/one.avi testdir/a/one.mp4 testdir/a/x.flv printf 'Illicit file found: %s\n' testdir/m/xfile.png testdir/a/b/y.jpg 'testdir/a/b/c/a b c.jpg' testdir/a/b/one.png testdir/a/x.gif rm testdir/m/xfile.png testdir/a/b/y.jpg 'testdir/a/b/c/a b c.jpg' testdir/a/b/one.png testdir/a/x.gif 命令总共执行四个命令,例如:

set -x &&

(您可以通过将cmd放在sudo的开头来弄清楚

<强>须藤

我建议在脚本中删除sudo,并仅在启动脚本时使用它,因为rm sudoers 安全策略的密码提示超时(默认值为5分钟)。

进一步简化

考虑使用-v的{​​{1}}(详细模式)选项,而不是手动打印要删除的文件,例如:rm -v $path