许多年前,我将部分文件转换为具有特定扩展名的任意格式。我不再希望这些文件是这种格式,我想开始替换它们,因为转换不是一个合适的解决方案。不幸的是,它们与我当前格式的文件(扩展名不同)混合在同一个根文件夹的不同文件夹中。我觉得如果我将每个包含不需要的格式的文件的文件夹移动到单独的根文件夹中,这个过程会更容易。这些文件存储在 Linux 服务器上并通过 samba 共享。我如何使用几个命令或脚本来做到这一点?我也愿意接受其他建议。我想避免花时间编辑文本文件。最后,我想要一个命令来生成文件夹的完整路径列表,按级别数排序会很不错。所有文件的列表显然不是我想要的。
答案1
查找 . -type f | sed "s#^.#$(pwd)#"
返回所有文件的完整路径 + 前导 / 当以 root 运行时,您可以将其传送到 grep 并匹配扩展名,然后是结束行
将其放入文本文件中进行操作
您现在可以计算一行中的 / 并将文件名从末尾拆分,然后将 mv $line 转到 /adir/filename
这一切都可以在一个 bash 脚本中完成...我对 bash 脚本的掌握还不够好,无法将其变成一行代码,但这可以让你基本掌握要领。但是,如果你这样做的话,你可能需要当心文件破坏。
我会如何处理它
来自这里是新的
因为显然我的工作是为您编写一个功能齐全的脚本,因为您无法阅读在线常见问题解答或在被问及它以何种方式失败时做出回应:
查找 . -type f | sed "s#^.#$(pwd)#" | grep '.xml'> test.txt ./atest.sh > 测试2.txt ----atest.sh 开始---- /bin/bash #!/bin/bash 读行时 做 目录名 $line 完毕
你还需要脚本做什么?因为我真的没有更好的事情可做
该脚本的输出只是包含以 .xml 结尾的文件或以 .xml 结尾的目录的目录名称
答案2
这来源应该是您正在搜索的最上层目录。如果文件存储在整个文件系统中,那么来源应该是文件系统本身。
find ~/SOURCE -name '*.YOUR_EXTENSION' -exec mv {} ~/DESTINATION \;
像这样重命名它们:
$ rename -v 's/\.YOUR_EXTENSION$/\.NEW_EXTENSION/' *.YOUR_EXTENSION
在您实际想要重命名之前使用该-n
选项而不是该选项来运行该选项是一个好主意,因为该选项只会运行模拟并提供该模拟的结果。-v
-n
答案3
12 年后;找到具有所需扩展名的文件的路径,从路径中删除文件名,对结果进行排序,确保每个文件只有 1 个,然后将它们移动到目标:
find ./ -name "*.txt" | sed "s/\/[^/]*.txt//" | sort | uniq | xargs mv -t /destination/