我使用以下方法创建了一个文件:
$ ls > ls.txt
现在我想转到另一个目录并使用此文件创建一堆空文件,其名称来自ls.txt
.
做到这一点最简单的方法是什么?
答案1
您可以使用xargs
。切换到新目录后,
xargs -d '\n' touch -- < path/to/ls.txt
请注意,如果输出中最初有任何目录ls
,这些目录将在新位置中创建为纯文件。
答案2
让我鼓励你退后一步。
听起来你的实际问题是:“我当前目录中有一些文件,我想在不同的目录中创建同名的空文件。”
您认为执行此操作的合理方法是将结果保存ls
到文件中。这是一个合理的假设,但肯定不是唯一的方法!
那么下面的怎么样?
for filename in *; do
touch -- "/path/to/somewhere/else/${filename}"
done
其中/path/to/somewhere/else/
是要在其中创建文件的目录。
这种方法简单易读。此外,它对文件名中的空格、换行符和特殊字符完全可靠。如果您的个人资料已别名ls
为类似ls --color
.
缺点是,如果您确实有很多文件,那么这可能会做很多额外的工作。但在它真正成为问题之前,请不要担心。*
另一个缺点是,如果当前目录中没有文件,这将创建一个字面上称为*
.您可以通过shopt -s nullglob
在循环之前编写来避免这种情况。
d
请注意(与其他解决方案一样)如果当前目录中有一个目录,d
则将在目标处创建一个新的空文件。如果你想避免这种情况,你可以这样写:
for filename in *; do
if [ -f "${filename}" ]; then
touch -- "/path/to/somewhere/else/${filename}"
fi
done
仅处理普通文件。
* 如果这是一个问题:printf '\0\n' * | (cd /path/to/somewhere/else; xargs -0 touch --)
会很好地解决问题。
答案3
sed "s/\(.*\)/touch '\1'/" < ls.txt | sh
这会将文件转换为 shell 脚本,该脚本使用 创建文件touch
,并将该脚本写入 shell 会话。从您想要文件的文件夹运行此命令。如果它位于不同的文件夹中,则替换ls.txt
为其完全限定名称。
答案4
OFS=$IFS;
IFS=$'\n';
cd to_new_location;
for file in `cat /path/to/ls.txt`; do
touch $file;
done;
IFS=$OFS;