【发布时间】:2012-02-28 04:59:03
【问题描述】:
我正在尝试编写一个简单的 bash 脚本,用新文件替换目录中的所有文件,但保留每个被替换文件的名称。
看起来这应该很容易,所以如果这很明显,我提前道歉。
【问题讨论】:
-
您希望新文件中有什么内容 - 它们应该是空的吗?
-
用什么替换每个文件?其他地方的副本?新内容?从哪里来?
我正在尝试编写一个简单的 bash 脚本,用新文件替换目录中的所有文件,但保留每个被替换文件的名称。
看起来这应该很容易,所以如果这很明显,我提前道歉。
【问题讨论】:
由于您只想要新文件的内容但保持文件名相同,因此您可以使用cat 一步完成。
以下两个脚本以递归方式工作,并且可以使用任何文件名,即使是包含空格或换行符或其他任何可能在您尝试解析 ls 输出时中断的文件。
#!/bin/bash
newFile="/path/to/newFile"
while IFS= read -r -d '' file; do
cat "$newFile" > "$file"
done < <(find . -type f -print0)
#!/bin/bash
newFile="/path/to/newFile"
shopt -s globstar
for file in **; do
[[ -f "$file" ]] || continue
cat "$newFile" > "$file"
done
【讨论】:
#!/bin/sh
for i in *; do
if [ -f "${i}" ] ; then
cat /dev/null > "${i}";
fi;
done
【讨论】:
试试这个:
for file in *; do
if [ -f "$file" ] ; then
> "$file"
fi
done
【讨论】:
如果您安装了 GNU Parallel:
find . -type f -print0 | parallel -0 cat /path/to/foo \> {}
如果你在一个只包含文件(没有目录)的目录中,那么这会更短,并且可能更容易记住:
parallel cat /path/to/foo \> {} ::: *
它可以正确处理包含空格、' 和 " 的文件(对于包含换行符的文件名,您需要上述内容)。
您可以通过以下方式安装 GNU Parallel:
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
观看介绍视频以了解更多信息:http://pi.dk/1
【讨论】:
#!/bin/bash
while read name; do
cp "/directory/$name" /backup/
mv /new/replacement "/directory/$name"
echo "replaced /directory/$name with /new/replacement and stored backup in /backup"
done <<< "$(ls -1 /directory/)"
您可能会计划更改代码示例中的 /directory /backup 和 /new/replacement。 您可以使用“find”而不是“ls”来进行递归。 它现在不会有空间问题。
【讨论】:
ls?
ls 而不仅仅是使用 glob。请阅读this link为什么不惜一切代价避免解析ls
ls 的输出执行分词。它仍然会因带有空格的文件名而严重中断。我见过很多“真实世界的目录”,其中包含名称中带有空格的文件。当 shell 已经提供了不受此问题影响的 globbing nativity 时,为什么还要使用劣质的外部工具呢? 2)也许您将我的回答与其他人混淆了,但我也不是“所有文件大小为零”而是“替换所有文件”