我有一个包含一些名称/ID 的列表,并且在同一目录中有来自该列表的原始文件。我试图找到如何将原始文件移动到另一个文件夹,但仅限于出现在列表中的文件?
所以我的 list/txt 文件如下所示:
2mtz.pdb
2lbq.pdb
2kad.pdb
和我的原始文件有完全相同的 ID,但我必须找到一种方法来仅移动列表中的文件。
答案1
以下是两个使用while
循环的例子。
在下一个示例中,调用文件的内容list
将被重定向到while
循环,其中每一行将作为read
变量的值$FILE_NAME
,该变量将用作mv
命令中的参数。
while IFS= read -r FILE_NAME; do mv "$FILE_NAME" "/dest/dir/"; done < /path/to/list
在下一个示例中,该命令cat
将输出名为 的文件的内容list
。输出将通过管道传输到while
循环,其中每一行将作为read
变量 的值$FILE_NAME
,该变量将用作mv
命令中的参数。
cat /path/to/list | while IFS= read -r FILE_NAME; do mv "$FILE_NAME" "/dest/dir/"; done
我认为使用重定向是更好的方法。下面提供了有关此用法的更详细说明while
:While 循环仅处理 ssh 命令的第一个条目。
答案2
在 Unix 中,如果我们努力尝试,文件名可能会包含各种意想不到的字符。只要有可能,我们通常避免在文件名和目录中使用空格、'?'、'\n'、'('、'*' 等。
如果您的文件名没有“空格”和其他奇怪的字符,请尝试:
mv $(cat list/txt) destination/dir/
答案3
如果列表在文件中,/tmp/list.txt
您可以按照以下方式进行:
cat /tmp/list.txt | xargs mv -t /app/dest/
或更短:
xargs mv -t /app/dest/ < /tmp/list.txt
是命令的组合:
mv -t /app/dest/
使用选项 -t 或 --target-directory=DIRECTORY 将所有 SOURCE 参数移动到 DIRECTORY
xargs
并使用从标准输入执行命令行的命令,但在这种情况下,每一行都是/tmp/list.txt
因为我们使用重定向<
感谢其他问答https://unix.stackexchange.com/questions/115734/move-file-by-list-in-file-with-leading-whitespace