2012-07-20 149 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

相关问题