2016-11-26 58 views
2

我试图在Ubuntu中创建一个shell脚本,它将删除所有媒体文件并记录它们的位置。到目前为止,这是我删除器脚本的部分: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. 我运行,在./Documents文件夹中创建Illicitmedia.txt的脚本。

  2. 我运行发现的所有媒体文件,然后回显所有的文件路径到日志文件中像格式的脚本:Illicit file found in: /home/user/Pictures/Photo.jpg

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

所以最后,我仍然需要帮助的唯一一步是第2步。有人可以帮助我吗?

+0

关于此问题的信息太多。为什么不请求#2?做一些简单的事情,比如sudo find/dir -type f -printf /tmp/myLog.log 2>&1,然后通过文件读取以逐个删除 – NinjaGaiden

回答

1

在这里,我只是做了第一线,你向你展示的概念,请理念应用到你的脚本的其余部分:

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

你的日志将被保存在/ tmp目录/日志和你可以把它复制到你想要的任何地方。如果你真的需要日志的每一行说“中发现的非法文件:”文件路径前,然后运行以下后的日志完成:

sed -i -e 's/^/Illicit file found in: /' /tmp/log 
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连接。 $字符是一个结束线锚。

使用OR操作

顺便说一句,你可能会组-name选择使用操作如下:

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" "[email protected]" >> "'"$log"'" && rm "$0" "[email protected]"' 

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" {} + 

由于[email protected]扩展到位置参数,从1开始,我们需要传递$0以及(的-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对于sudoer具有密码提示超时s安全策略(默认值为5分钟)。

进一步简化

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