Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过搜索字符编辑文件名_Bash_Unix - Fatal编程技术网

Bash 通过搜索字符编辑文件名

Bash 通过搜索字符编辑文件名,bash,unix,Bash,Unix,因此,我遇到了一个任务问题,该任务要求我搜索目录中具有类似以下命名约定的所有.mp3文件: Beatles - Lucy in the Sky with Diamonds.mp3 Beatles/Lucy in the Sky with Diamonds.mp3 然后,我需要把它放在一个类似于: Beatles - Lucy in the Sky with Diamonds.mp3 Beatles/Lucy in the Sky with Diamonds.mp3 我对UNIX很陌生,但

因此,我遇到了一个任务问题,该任务要求我搜索目录中具有类似以下命名约定的所有.mp3文件:

Beatles - Lucy in the Sky with Diamonds.mp3
Beatles/Lucy in the Sky with Diamonds.mp3
然后,我需要把它放在一个类似于:

Beatles - Lucy in the Sky with Diamonds.mp3
Beatles/Lucy in the Sky with Diamonds.mp3
我对UNIX很陌生,但我对基本概念有很好的掌握

我知道如何“剥离”文件名的扩展名(这样“披头士-钻石天空中的露西”就可以保留了)

我还知道如何搜索目录中的所有文件

但是,我不熟悉如何搜索“-”

我知道C++中的类似内容,我可以搜索特定的字符(“-”)并获得int并创建子字符串,但是我不知道UNIX中有这样的函数。p> 我不是在寻找完整的代码来完全回答这个问题,但我想知道如何搜索字符和编辑文件名

谢谢

编辑:

使用nosid所说的,我成功地将文件名在艺术家和歌曲标题之间拆分,如下所示:

artist="${originalFile%% - *}"
song="${originalFile#* - }" 
因此,该部分工作并将它们分离,但当我尝试移动文件时,出现了一个新问题。我有两条if语句来检测目录是否存在,如果不存在,它将创建该目录。但是,如果我使用artist变量作为目录名,它将创建2个目录。使用这首歌也是如此

因此,本质上,当我尝试mkdir或mv时,如何使文件/dir名称中的空格被忽略,类似于:

mkdir ${artist};
mv ${artist}/${song};
您可以将参数扩展与
%%
#
一起使用,以删除所有最长匹配后缀和最短匹配前缀:

source="Beatles - Lucy in the Sky with Diamonds.mp3"
target="${source%% - *}/${source#* - }"
也可以使用模式替换:

您可以将参数扩展与
%%
#
一起使用,以删除所有最长匹配后缀和最短匹配前缀:

source="Beatles - Lucy in the Sky with Diamonds.mp3"
target="${source%% - *}/${source#* - }"
也可以使用模式替换:


一种方法是使用
awk
程序:

$echo "Beatles - Lucy in the Sky with Diamonds.mp3" |
awk -F- '{
  gsub(/ *$/, "", $1);
  gsub(/^ */, "", $2);
  print $1 "/" $2}'
这个输出

Beatles/Lucy in the Sky with Diamonds.mp3

-F-
选项分割“-”字符上的字段,因此
$1
是“披头士”(带尾随空格),而
$2
是“天空中的露西与钻石.mp3”(带前导空格)。两个
gsub
命令删除这些空格,并
print
打印它们,中间有一个“/”。

一种方法是使用
awk
程序:

$echo "Beatles - Lucy in the Sky with Diamonds.mp3" |
awk -F- '{
  gsub(/ *$/, "", $1);
  gsub(/^ */, "", $2);
  print $1 "/" $2}'
这个输出

Beatles/Lucy in the Sky with Diamonds.mp3

-F-
选项分割“-”字符上的字段,因此
$1
是“披头士”(带尾随空格),而
$2
是“天空中的露西与钻石.mp3”(带前导空格)。两个
gsub
命令删除这些空格,并
print
打印它们,中间带有“/”。

要识别文件,请循环使用通配符匹配

for file in *\ -\ *.mp3; do
    artist="${file%% - *}"
    song="${file#* -  }"
    :
done

循环的主体本质上与@nosid的答案相同。您可能需要修改参数替换中的空格,具体取决于shell。(例如,对于旧版本的Bash,可能会将空格反斜杠。)

要识别文件,请在通配符匹配上循环

for file in *\ -\ *.mp3; do
    artist="${file%% - *}"
    song="${file#* -  }"
    :
done

循环的主体本质上与@nosid的答案相同。您可能需要修改参数替换中的空格,具体取决于shell。(例如,对于旧版本的Bash,可以将空格反斜杠。)

谷歌“Bash-tr”、“Bash-grep”、“Bash-awk”、“Bash-for-loops”,你会发现大量关于如何实现这一点的信息。你必须在变量周围使用引号,即
“$artist”
而不是
${artist}
。请不要编辑问题来询问其他问题。问一个新问题,然后先搜索类似的问题。谷歌“bash tr”、“bash grep”、“bash awk”、“bash for loops”,你会找到大量关于如何做的信息。你必须在变量周围使用引号,即
“$artist”
而不是
${artist}
。请不要编辑问题来询问其他问题。先问一个新问题,然后搜索类似的问题。首先,感谢您的及时回复和帮助。我更新了我的问题,因为我在使用你提供的方法时遇到了一个小问题。你能帮我解决这个问题吗?首先,感谢你及时的回复和帮助。我更新了我的问题,因为我在使用你提供的方法时遇到了一个小问题。你能帮我解决这个问题吗?