Bash 如何基于密钥移动特定文件并重命名它们

Bash 如何基于密钥移动特定文件并重命名它们,bash,scripting,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

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

我想多写一篇文章而不是评论会有所帮助。要采取的方法是从key.txt中的每一行读取文件名fname和ID ID,然后验证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
key.txt文件:

脚本执行前的文件位置。dest是要移动到的目录。也就是说,ls-one输出不是ls-Llowercase,ls-al是'Llowercase'

$ 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
执行后dest的内容

$ ls -al dest
total 8
drwxr-xr-x 2 david david 4096 Jan 17 20:00 .
drwxr-xr-x 3 david david 4096 Jan 17 20:00 ..
-rw-r--r-- 1 david david    0 Jan 17 19:59 TCCC-06-0210.txt
-rw-r--r-- 1 david david    0 Jan 17 19:59 TCHA-27-2519.txt
-rw-r--r-- 1 david david    0 Jan 17 19:59 TCHU-76-4929.txt

读取时-r fname id;do[-f$fname]&&mv$fname/path/to/move/to;完成$ ls -1 dest key.txt move_rename.sh
$ ls -al dest
total 8
drwxr-xr-x 2 david david 4096 Jan 17 20:00 .
drwxr-xr-x 3 david david 4096 Jan 17 20:00 ..
-rw-r--r-- 1 david david    0 Jan 17 19:59 TCCC-06-0210.txt
-rw-r--r-- 1 david david    0 Jan 17 19:59 TCHA-27-2519.txt
-rw-r--r-- 1 david david    0 Jan 17 19:59 TCHU-76-4929.txt