我有超过100000个文件。
例如,我在下面提到了3个文件
bcbb79d8-1d4a-4fbb-b16c-4df86839773e.htseq.counts.gz
bcdc68db-c874-4097-9c46-b06e331caaf5.htseq.counts.gz
bd4b6975-90d9-43f8-aadc-344d04644822.htseq.counts.gz
我有一个名为key.txt的文本文件,其中包含以下信息。
File Name ID
bcbb79d8-1d4a-4fbb-b16c-4df86839773e.htseq.counts.gz TCCC-06-0210
bcdc68db-c874-4097-9c46-b06e331caaf5.htseq.counts.gz TCHA-27-2519
bd4b6975-90d9-43f8-aadc-344d04644822.htseq.counts.gz TCHU-76-4929
我想只获取其名称在密钥中的那些文件,将它们移动到新文件夹并将其名称更改为ID。
答案 0 :(得分:1)
我想更多的写作而不是评论会有所帮助。要采取的方法是从fname
中的每一行读取文件名(id
)和ID(key.txt
),然后验证 fname
是一个文件并且确实存在,然后将"$fname"
中的文件移动到您需要的任何"/path/to/move/to/$id"
。
例如:
#!/bin/bash
## read each line into variables fname and id (handle non-POSIX eof)
while read -r fname id || [ -n "$fname" ]; do
## test that "$fname" is a file, and if so, move to destination
[ -f "$fname" ] && mv "$fname" "/path/to/move/to/$id"
done < key.txt
(注意:一个POSIX文件结尾(eof
)只是最后一行末尾的最后'\n'
。有些编辑不执行它并且它会导致您的读取错过最后一行数据,除非您检查"$fname"
是否填充了数据(非空) - [ -n "$fname" ]
添加到{{1}的末尾})
您正在为循环提供white read -r ...
的重定向。 key.txt
循环的每次迭代都会将while
中的新行读入变量key.txt
和fname
(默认内部字段分隔符上的分词(id
)。在读取并分离到IFS
和fname
之后,您只需验证id
是否包含有效的文件名(在当前工作目录中),然后{ {1}}您想要的文件。
您应该在包含这些文件的目录中执行该脚本,或者将相对或绝对文件名附加到它们所在的位置$fname
。
示例强>
这是一个简短的例子,可以帮助解决问题:
mv
脚本:
"$fname"
move_rename.sh
文件:
$ cat move_rename.sh
#!/bin/bash
## read each line into variables fname and id (handle non-POSIX eof)
while read -r fname id || [ -n "$fname" ]; do
## test that "$fname" is a file, and if so, move to destination
[ -f "$fname" ] && mv "$fname" "dest/$id.txt"
done < key.txt
脚本执行前的文件位置。 (dest)是要移动到的目录。 (即key.txt
输出不是$ cat key.txt
File Name ID
bcbb79d8-1d4a-4fbb-b16c-4df86839773e.htseq.counts.gz TCCC-06-0210
bcdc68db-c874-4097-9c46-b06e331caaf5.htseq.counts.gz TCHA-27-2519
bd4b6975-90d9-43f8-aadc-344d04644822.htseq.counts.gz TCHU-76-4929
,ls -one
是'L(小写))
ls -L(lowercase)
执行脚本
ls -al
执行后的工作目录内容
$ ls -1
dest
bcbb79d8-1d4a-4fbb-b16c-4df86839773e.htseq.counts.gz
bcdc68db-c874-4097-9c46-b06e331caaf5.htseq.counts.gz
bd4b6975-90d9-43f8-aadc-344d04644822.htseq.counts.gz
key.txt
move_rename.sh
$ ls -al dest
total 16
drwxr-xr-x 2 david david 4096 Jan 17 20:05 .
drwxr-xr-x 16 david david 12288 Jan 17 20:05 ..
执行后$ bash move_rename.sh
的内容。
$ ls -1
dest
key.txt
move_rename.sh