我正在使用以下命令将文件从 src 文件夹复制到 dest 文件夹:
cp -nv /src/* /dest/ > copy_result.txt
复制文件的结果在输出文件中如下所示:
« /src/test1.txt » -> « /dest/test1.txt »
« /src/test2.txt » -> « /dest/test2.txt »
否则,我希望输出文件只包含文件名,不包含整个路径和文件扩展名,如下所示:
test1
test2
我正在使用以下命令将文件从 src 文件夹复制到 dest 文件夹:
cp -nv /src/* /dest/ > copy_result.txt
复制文件的结果在输出文件中如下所示:
« /src/test1.txt » -> « /dest/test1.txt »
« /src/test2.txt » -> « /dest/test2.txt »
否则,我希望输出文件只包含文件名,不包含整个路径和文件扩展名,如下所示:
test1
test2
试试命令
awk
打印第六个字段。并rev
反转字符串。cut
在 指定的分隔符处拆分字符串-d
,提取 指定的部分-f
。编辑:
正如所指出的,这对带空格的文件/目录不友好。但这将通过提取 '-> « ' 和 ' »' 之间的子字符串:
-v
不是由 POSIX 指定的。这意味着每个cp
实现可能会以不同的方式处理它(或根本不处理)。你cp
说« foo »
我说的地方'foo'
。可以设计一个命令将您不需要的输出转换为所需的输出,但我仍然想提出一个独立于cp
实现的解决方案。在
/src/*
您的命令展开后,cp
将结果条目一一复制。这意味着你可以cp -n /src/* /dest/
变成现在很容易用
$file
. 这将生成您想要的输出:(要重定向到
copy_result.txt
使用done > copy_result.txt
而不仅仅是done
)。请注意,如果您使用
cp -r -v
并且至少一个来自扩展的操作数/src/*
是一个目录,cp
将复制并打印其内容,而上面的代码(在我们添加之后-r
)将复制尽可能多但仅打印目录本身。-r
可能不是会引入差异的唯一选择。因此,虽然该方法应该独立于
cp
实现,但它依赖于未使用的某些选项。另一个缺点是代码cp
为 中的每个对象运行一个单独的进程/src/
,这远非最佳。还有一个竞争条件:如果
$dst
文件出现在[
和之间cp
,cp
将完成它的工作。您可以使用cp -n
避免覆盖,但printf
仍会报告该文件。