2016-11-26 71 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

相關問題