2012-07-20 65 views
3

我是shell編程的新手。我想將任何可執行文件,以shebang(#!)開頭的任何文件以及名稱以.sh結尾的文件從目錄移動到/ tmp/backup並記錄移動文件的名稱。如何刪除以#開頭的文件!或以.sh結尾的名稱

這是我做了什麼至今

搜索文件與#^

grep -ircl --exclude=*.{png,jpg,gif,html,jar} "^#" /home 

查找可執行文件

find . -type f -perm +111 or find . -type f -perm -u+x 

現在我奮力這兩個命令如何會得到一個最終的輸出,我可以通過執行備份並從當前目錄中刪除

感謝

+1

最好的學習方法是先嚐試一下,然後在卡住時尋求指導。如果您已經嘗試過,請發佈您目前爲止所做的工作,以便其他人可以爲您提供具體和相關的建議。 – 2012-07-20 09:40:40

+0

這是我做了什麼至今 Seraching與#^ grep的-ircl --exclude = * {PNG,JPG,GIF,HTML,罐子} 「^#」/家 查找可執行 查找文件。 -type f -perm +111或find。 -type f -perm -u + x 現在我正在努力如何將這兩個命令分配到最終的輸出,我可以通過它來執行備份並從當前目錄中刪除 – 2012-07-20 09:53:27

+2

請在您的問題中進行編輯。在評論中閱讀代碼很困難。 – 2012-07-20 10:01:24

回答

0

使用xargs命令

「find命令」 | xargs的「grep命令」

0

你可以把一切都放在一個文件,排序,然後使用awk處理它:

# Select all files to move 
grep -ircl --exclude=*.{png,jpg,gif,html,jar} '^#\!' /home > list.txt 
find /home -type f \(-perm -u+x -o -name "*.sh" \) -print >> list.txt 

# Feed them to Awk that will log and move the file 
sort list.txt | uniq | awk -v LOGFILE="mylog.txt" ' 

{ print "Moving " $0 >> LOGFILE 
    "mv -v --backup \"" $0 "\" /tmp/backup" | getline 
    print >> LOGFILE }' 

編輯:你可以從這個骨架,通過增加一些變量做出正式腳本和一些額外的檢查:

#!/bin/bash 

LIST="$(mktemp || exit 1)" 
LOG="/tmp/mylog.txt" 
SOURCE="/home" 
TARGET="/tmp/backup" 

mkdir -p "${TARGET}" 

cd "${SOURCE}" || exit 1 

# Select all files to move 
grep -ircl --exclude=*.{png,jpg,gif,html,jar} '^#\!' "${SOURCE}" > "${LIST}" 
find "${SOURCE}" -type f \(-perm -u+x -o -name "*.sh" \) -print >> "${LIST}" 

# Feed them to Awk that will log and move the file 
sort "${LIST}" | uniq | awk -v LOGFILE="${LOG}" -v TARGET="${TARGET}" ' 

{ print "Moving " $0 >> LOGFILE 
    "mv -v --backup \"" $0 "\" " TARGET | getline 
    print >> LOGFILE }' 
+0

嗨,它給我下面的錯誤。 sh:-c:line 0:尋找匹配時出現意想不到的EOF''' sh:-c:第1行:語法錯誤:文件的意外結束 – 2012-08-16 11:54:21

+0

您能否提供一些有關腳本工作的簡介? – 2012-08-16 11:55:09

+0

這些命令應該工作沒有改變,也許你在某處忘了一個雙引號或一個反斜槓(它可能在awk命令的引用中)我已經給出了一個更正式的腳本例子,HTH – 2012-08-17 21:53:15

相關問題