我有一个很多文件的目录,像一个服务器上的50,000个pdf和其他文件。 我需要将特定的移动到另一个目录。 我可以生成需要以csv或任何其他文本格式移动的文件列表。
我需要做的是运行一个bash脚本,并将文本文件中列出的文件移动或复制到另一个目录。
有这样一个简单的方法吗? 任何build议或资源将不胜感激。
rsync有几个选项可以处理文件列表( --files-from
, --include-from
--files-from
等)。
为了避免无用的cat
(如果你不使用rsync
):
xargs -a file_list.txt mv -t /path/to/dest
这将处理任何有效的文件名,除非它包含一个换行符,如果文件列出每行一个。
for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done
假设bash,加上包含每行一个文件的列表文件。 我唯一反对rsync路由的是OP要求移动文件的方法,而不是复制它们。 rsync比皇室婚礼有更多的标志,所以我相信它可以做进一步的修改,但有时更简单更好!
这取决于你所拥有的文本文件的格式。 例如,如果您有写入的文件的列表,以便每个文件位于一个新行。 你可以像下面这样使用xargs:
$ cat your_text_file | xargs cp -t /path/to/destination
另外,您可以使用find
命令和-exec
选项。 复制/移动文件。
我认为rsync的答案是一个更好的,但只是另一种select:
tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)
我不小心将目录的全部内容复制到目标目录,而不是移动完整的目录。 这导致了一个混乱的目的地目录而不是被添加到目录的原始目录。
为了解决这个问题,我做了以下几点:
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
上面的命令创buildfilestomove文件,该文件将是目标目录的所有内容的列表,反向按时间sorting,意思是从最老到最新。
然后我创build了一个现在混乱的目的地目录的子目录来移动东西。
mkdir /path/to/cluttered/destination/directory/newsubdirectory
然后我重复目录列表,除了列表屏幕和显示更多的细节。
ls -lrht /path/to/cluttered/destination/directory/
此行列出目录,按date升序sorting(反向按时间sorting),并显示更多信息,包括每个文件在当前混乱的目标目录中的date/时间戳。 我提到这一点,从顶部开始显示我想保留在哪里的目录和文件。 所有新文件开始不应该在那里的文件的date/时间戳会有差距。
然后,我编辑了上面第一步创build的filestomove文件(按datesorting),并从列表中删除了那些之前我想保留原始目录的文件。
vim /opt/dircheck/filestomove
从顶部删除所有不想移动的文件。
然后,我使用本文前面列出的命令将列表中的文件移动到我创build的新目录中。
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 /path/to/move/files/to ) | xargs mv
尝试像这样:
cat list.txt | while read line; do mv "$line" /images; done
以下工作对我来说,我需要将所有的PNG文件从一个特定的path(和所有子目录)复制到一个新的位置,同时保留目录结构:
rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/
由于RSYNC首先创build目录结构的镜像,然后同步这些文件,最后可能会得到多余的空文件夹。 我用–prune-empty-dirs标志删除这些空目录。
我没有从属关系,但认为是正确的来源,启发这个解决scheme的来源: http : //techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/
Rsync比cp
或mv
命令有更多的好处,因为如果它们不存在,它将自动创build文件夹。