从文本文件列表创建文件

从文本文件列表创建文件

我使用以下方法创建了一个文件:

$ 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;

相关内容