2017-03-05 115 views
0

所以,我在bash中有一个名为songs_old的目录中有好几个文件。我想将它们复制到名称不同的歌曲文件夹中。输入文件的一些名称包括:批量复制并重命名Bash中的几个文件,使用下划线

unknownsong_song152.mid 
town_song154.mid 
nm_battle_song158.mid 
fanfare_song159.mid 

我想在“歌曲”的结果是这样的:

song152_unknownsong.mid 
song154_town.mid 
song158_nm_battle.mid 
song159_fanfare.mid 

我尝试下面的代码复制文件:

#!/bin/bash 
for i in "./songs_old/"*".mid";do mkdir -p "./songs" 
    cp "$i" "./songs/`basename "${i%.*}" | cut -d'_' -f2`_`basename "${i%.*}" | cut -d'_' -f1`.mid" 
done 

我的结果如下:

song152_unknownsong.mid 
song154_town.mid 
battle_nm.mid 
song159_fanfare.mid 

如何复制具有所需结果的文件?

回答

1

您的cp命令被传送到cut - 这就是问题所在。你可以重写循环是这样的:

#!/bin/bash 
mkdir -p songs 
cd songs_old 
for i in *.mid; do 
    [[ -f "$i" ]] || continue # make sure we have a file 
    new_file=$(sed -E 's/^(.*)_(song[0-9]+).mid$/\2_\1.mid/' <<< "$i") 
    echo "Copying $i to $new_file" 
    cp "$i" "../songs/$new_file" 
done 
  • 更有意义的cd'ing到songs_old和通配符打造的“歌曲”目录只是一次
  • ,我们消除了basename
  • 需要使用sed和正则表达式来创建新的名称
  • 使用相对路径../songs而拷贝

为了您的一组文件,它给出了这样的输出:

Copying fanfare_song159.mid to song159_fanfare.mid 
Copying nm_battle_song158.mid to song158_nm_battle.mid 
Copying town_song154.mid to song154_town.mid 
Copying unknownsong_song152.mid to song152_unknownsong.mid 
2

使用纯bash的正则表达式,你可以这样做:

cd songs_old 
mkdir -p ../songs 

for f in *.mid; do 
    [[ $f =~ ^(.+)_([^_]+)(\.[^.]+)$ ]] && 
     cp "$f" ../songs/"${BASH_REMATCH[2]}_${BASH_REMATCH[1]}${BASH_REMATCH[3]}" 
done 

这将运行以下为给定的样本cp命令:

cp unknownsong_song152.mid ../songs/song152_unknownsong.mid 
cp town_song154.mid ../songs/song154_town.mid 
cp nm_battle_song158.mid ../songs/song158_nm_battle.mid 
cp fanfare_song159.mid ../songs/song159_fanfare.mid 
+1

谢谢,我意识到我的错误:) – anubhava