如何根据键移动特定文件并重命名它们

时间:2018-01-18 01:35:17

标签: bash scripting

我有超过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。

1 个答案:

答案 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.txtfname(默认内部字段分隔符上的分词id)。在读取并分离到IFSfname之后,您只需验证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