Answers:
rsync的具有可采取文件的列表,以过程(几个选项--files-from
,--include-from
等等)。
例如,这将达到目的:
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
为了避免无用的使用cat
(如果您不使用rsync
):
xargs -a file_list.txt mv -t /path/to/dest
如果文件每行列出一个,则它将处理任何有效的文件名,除非它包含换行符。
mv
会将所有文件折叠到同一目标目录中。rsync
接受的答案中的方法不受此限制。
for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done
假设bash,listoffiles
每行包含一个文件。我对rsync路由的唯一反对意见是,OP要求一种移动文件而不复制文件的方法。rsync比皇室婚礼拥有更多的标志,所以我敢肯定它可以被进一步修改以做到这一点,但是有时候更简单更好。
while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/
Rsync相对于cp
or mv
命令具有更多的好处,因为如果不存在,它将自动创建文件夹。
/path/to/source
从文件列表获取路径时为什么需要?
我不小心将目录的完整内容复制到了目标目录中,而不是移动了完整目录。这导致目标目录混乱,而不是将原始目录添加到目录中。
为了解决这个问题,我做了以下工作:
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
上面的命令创建filestomove文件,该文件将是目标目录所有内容的列表,按时间反向排序,即从最早到最新。
然后,我创建了现在杂乱无章的目标目录的子目录,以将内容移动到其中。
mkdir /path/to/cluttered/destination/directory/newsubdirectory
然后,我重复了目录列表,但要列出屏幕并显示更多详细信息。
ls -lrht /path/to/cluttered/destination/directory/
该行列出了按日期升序排序的目录(按时间反向排序),并显示了更多信息,包括当前混乱的目标目录中每个文件的日期/时间戳。我指的是此内容,从顶部开始显示我想保留的目录和文件。在文件的日期/时间戳记中,所有新文件都将以不存在的地方出现间隙。
然后,我编辑了在上面第一步中创建的filestomove文件(按日期排序),并从列表中删除了一些我想保留在原始目录中的文件。
vim /opt/dircheck/filestomove
从顶部删除所有您不想移动的文件。
然后,使用本文前面列出的命令将列表中的文件移动到我创建的新目录中。
sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory
这很快就移动了所有文件。(注意:开始时可能不需要sudo,这是文件权限问题)。
现在,我原来的目标目录干净整洁,并包含一个新目录,其中包含所有混乱的文件和目录。
如果(且仅当)文件名中没有任何讨厌的字符(空格,换行符,这会使xargs混淆如何将其分解为单个参数),并且生成了一个由换行符分隔的文件列表(一个文件每行),您可以执行类似操作。
cat filenames.txt | xargs mv -t /path/to/move/files/to
(总的来说,请参见man xargs,这太棒了)
如果您的特定MV没有-t选项,则还可以进行一些欺骗性的操作,例如
( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv
注意-如果碰巧其中包含换行符的文件名,则这两个文件均无法正常工作。
(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
在我需要将所有PNG文件从特定路径(和所有子目录)复制到新位置并同时保留目录结构的情况下,以下代码为我工作:
rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/
由于RSYNC首先创建目录结构的镜像,然后同步文件,所以最终可能会留下多余的空文件夹。我使用--prune-empty-dirs标志删除了这些空目录。
我没有任何隶属关系,但认为应该对启发该解决方案的消息来源表示赞赏:http : //techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/