我试图在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
日志文件。
基本上:
我运行了一个在Illicitmedia.txt
文件夹中创建./Documents
的脚本。
我运行一个查找所有媒体文件的脚本,然后以下列格式将所有文件路径回显到日志文件:Illicit file found in: /home/user/Pictures/Photo.jpg
然后,在记录每个媒体文件后,我的其他脚本将通过并删除违禁品文件。
总而言之,我仍然需要帮助的唯一步骤是第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
可以将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开始,我们也需要传递-c
(find
选项的效果)。上面的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
。