3

我是 shell 编程的新手。我想将任何可执行文件、任何以 shebang(#!) 开头的文件以及名称以.sh目录结尾的任何文件移动到 /tmp/backup 并记录移动文件的名称。

这是我到目前为止所做的

搜索文件#^

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

查找可执行文件

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

现在我正在努力如何组合这两个命令以获得最终输出,我可以通过它来执行备份并从当前目录中删除

谢谢

4

2 回答 2

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 }'
于 2012-07-21T12:23:38.583 回答
0

使用 xargs 命令

“查找命令” | xargs "grep 命令"

于 2012-07-21T09:22:25.440 回答