Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
Linux 使用bash将文件复制到等级库文件夹_Linux_Bash - Fatal编程技术网

Linux 使用bash将文件复制到等级库文件夹

Linux 使用bash将文件复制到等级库文件夹,linux,bash,Linux,Bash,我有一个包含相当多子文件夹的文件夹。在某些子文件夹中,我有一张folder.jpg图片。我尝试做的是找到该文件夹并将其复制到所有其他子文件夹,这些子文件夹获得相同的艺术家和专辑信息,然后继续下一张专辑等 所有文件夹的结构都是“artist-year-album-[encoding information]”。 我已经做了一个非常简单的一行,找到文件夹,得到了文件,但我卡住了 ls -F | grep / | while read folders;do find "$folders" -name

我有一个包含相当多子文件夹的文件夹。在某些子文件夹中,我有一张folder.jpg图片。我尝试做的是找到该文件夹并将其复制到所有其他子文件夹,这些子文件夹获得相同的艺术家和专辑信息,然后继续下一张专辑等

所有文件夹的结构都是“
artist-year-album-[encoding information]
”。 我已经做了一个非常简单的一行,找到文件夹,得到了文件,但我卡住了

ls -F | grep / | while read folders;do find "$folders" -name folder.jpg; done
有没有人有什么好的建议或想法来解决这个问题,或者给我们指点如何继续

编辑:

首先,我是个新手(你说不出来),所以请耐心点

好吧,让我更详细地解释一下

我的文件夹结构如下所示:

artist1 - year - album - [flac]
artist1 - year - album - [mp3]
artist1 - year - album - [AAC]
artist2 - year - album - [flac]
etc
我喜欢循环浏览具有相同艺术家和专辑信息的文件夹集,并查找
folder.jpg
文件。当我找到该文件时,我希望将其复制到同一集中的所有其他文件夹中

例如,如果我在
artist1-year-album-[flac]
文件夹中找到一个
folder.jpg
,我想把这个
folder.jpg
复制到
artist1-year-album-[mp3]
&
艺人1年-专辑-[AAC]
但不是艺人2年-专辑-[flac]

继续循环,直到处理完所有集合。我真的希望这能让我更容易理解我想做什么:)


对于已经在所有编码中包含folder.jpg的集合来说,这是低效的,但是除非有错误,否则它应该可以完成这项工作。

我知道这不是最有效或最正确的代码,但这对我来说是有效的,我在正确的文件夹中获得了正确的folder.jpg

IFS='
'

source=( `find . -name folder.jpg |  sed 's/^..//' | sort -u` )
   for s in ${source[@]}
        do

          fullname=(`echo $s | cut -d'/' -f1 | sort -u`)
          checkname=`echo $fullname | cut -d'[' -f1 | sort -u`
          match=( `find . -name "$checkname*" | sed 's/^..//' | sort -u` )

             for a in ${match[@]}
                do
                    if [[ "$a" == "$fullname" ]];
                    then
                        echo $a 'not copied'
                    else
                        echo $a
                        #echo $match '*M*'
                        cp $s "$a/folder.jpg"

                    fi    
                done


    done

folder.jpg是否总是只有一个子文件夹?如果有多个folder.jpg,该怎么办?你不想保留原件还是不在乎?文件夹可以不止一个。jpg但我不想保留任何“原件”,只要上面写的是同一个“集”(艺术家-专辑)。该脚本的重要性/理念是,不会将错误的folder.jpg复制到错误的文件夹集中,并且所有文件夹都会获得正确的folder.jpg的副本。这有意义吗?简单的
找不到-name folder.jpg
够了吗?在我看来,你把事情复杂化了。。。另外,举一个“拥有这些和这些文件夹,而这些有folders.jpg和其他人没有,我希望……发生”的例子也不错,因为我不明白你真正想要的是什么。谢谢你的反馈。我用更多的信息更新了原来的帖子,希望这会对你有所帮助:)你可以使用
cut
命令来提取目录名的公共部分。如果不行,我希望你能自己修复它-它足够小,可以理解它。J.F.Sebastian-这个例子没有显示出这种可能性:-)我认为把它们分散在一起是一种疯狂的组织。Franko知道这是否可能发生,或者同一张专辑的dir肯定是兄弟姐妹。IFS会处理它,并引用包含文件名的每个变量。@herby:我错过了它。你为什么不把它写成
IFS=“\n”
?我现在已经测试过了,并且得到了一个
命令替换:第3行:在寻找匹配的
''和
命令替换:第4行:语法错误:文件的意外结尾
我想在
的@/folder\.jpg$@
之后缺少了一个,但是,即使添加了使脚本运行的内容,也不会复制folder.jpg。但我喜欢这个例子。希望能让我更深入地了解未来如何为此类任务构建shell脚本。
IFS='
'

source=( `find . -name folder.jpg |  sed 's/^..//' | sort -u` )
   for s in ${source[@]}
        do

          fullname=(`echo $s | cut -d'/' -f1 | sort -u`)
          checkname=`echo $fullname | cut -d'[' -f1 | sort -u`
          match=( `find . -name "$checkname*" | sed 's/^..//' | sort -u` )

             for a in ${match[@]}
                do
                    if [[ "$a" == "$fullname" ]];
                    then
                        echo $a 'not copied'
                    else
                        echo $a
                        #echo $match '*M*'
                        cp $s "$a/folder.jpg"

                    fi    
                done


    done