在Bash中使用下划线大容量复制和重命名多个文件

在Bash中使用下划线大容量复制和重命名多个文件,bash,Bash,因此,我在bash中的一个名为songs_old的目录中有几个文件。我想将它们复制到一个名为songs的文件夹中,并使用不同的名称。输入文件的一些名称包括: unknownsong_song152.mid town_song154.mid nm_battle_song158.mid fanfare_song159.mid 我希望“歌曲”中的结果如下: song152_unknownsong.mid song154_town.mid song158_nm_battle.mid song159_f

因此,我在bash中的一个名为songs_old的目录中有几个文件。我想将它们复制到一个名为songs的文件夹中,并使用不同的名称。输入文件的一些名称包括:

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

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

您的
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

您的
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

使用纯bash regex,可以执行以下操作:

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

使用纯bash regex,可以执行以下操作:

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

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