认为我很沮丧......我在过去的 2 个小时里试图弄清楚如何让一个包含管道的命令将输出泵送到一个 for 循环。关于我正在尝试的内容的快速故事,然后是我的代码。
我多年来一直在使用 xbmc。然而,在我开始后不久,我导出了我的库,结果证明这比它的价值更麻烦(尤其是我现在正在使用一组文件夹和其中包含的文件的命名方案)。我想删除 xbmc 添加的所有文件,所以我想我会编写一个脚本来删除所有必要的文件。但是,这就是我遇到问题的地方。
我正在尝试使用 locate 命令(因为它的速度),然后是一个 grep(删除所有文件系统 .tbn)和一个 egrep(从结果中删除 xbmc 创建的 .actors 文件夹),然后是一个排序(尽管排序不是必需的,我在调试期间添加了它,因此测试时的输出更好)。问题是只处理第一个文件,然后什么也没有。我在网上阅读了很多内容,发现 bash 为每个管道创建了一个新的子 shell,当它完成一次循环时,变量现在已经死了。所以我对如何解决这个问题做了更多的挖掘,一切似乎都表明我可以在 while 循环中解决它,但对于 for 循环却没有。
虽然我喜欢认为我能胜任脚本编写,但我总是会遇到这样的事情,这证明我仍然只是在学习基础知识。比我聪明的人的任何帮助将不胜感激。
#!/bin/bash
for i in "$(locate tbn | grep Movies | egrep -v .actors | sort -t/ +4)"
do
DIR=$(echo $i | awk -F'/' '{print "/" $2 "/" $3 "/" $4 "/" $5 "/"}')
rm -r "$DIR*.tbn" "$DIR*.nfo" "$DIR*.jpg" "$DIR*.txt" "$DIR.actors"
done
阅读下面的回复后,我认为完成我想要的更好的途径如下。我很想对新剧本提出任何建议。我不只是复制和粘贴@Charles Duffy 的脚本,而是想找到正确/最佳的方式来作为一种学习体验,因为总有更好和最好的方式来编写代码。
#!/bin/bash
for i in "*.tbn" "*.nfo" "*.jpg" "*.txt" "*.rar" #(any other desired extensions)
do
find /share/movies -name "$i" -not -path "/share/movies/.actors" -delete
done
我-not -path
首先在其中删除 xbmc 从输出中放置在源目录根目录(在本例中为 /share/movies)的 .actors 文件夹,因此不会从那里删除缩略图(.tbn 文件),但是我希望将它们从包含在 /share/movies 中的任何其他目录中删除(如果缩略图包含在特定的电影文件夹中,我想从 .actors 文件夹中删除它)。该-delete
选项是因为它是在 gnu.org 页面中建议的,它-delete
比调用更好,/bin/rm
因为不需要为 rm 进程分叉,这样可以提高效率并防止开销。
我很确定我希望 for 行中的项目被引用,因此它是*.tbn
在 find 命令中使用的文字。为了让您了解目录结构,它非常简单。我想删除这些目录中的任何 *.tbn *.jpg 和 *.nfo 文件。
/share/movies/movie 1/movie 1.mkv
/share/movies/movie 1/movie 1.tbn
/share/movies/movie 1/movie 1.jpg
/share/movies/movie 1/movie 1.nfo
/share/movies/movie 2/movie 2.mp4
/share/movies/movie 2/movie 2.srt
/share/movies/movie 2/movie 2 (subs).rar
/share/movies/movie 3/movie 3.avi
/share/movies/movie 3/movie 3.tbn
/share/movies/movie 3/movie 3.jpg
/share/movies/movie 3/movie 3.nfo
/share/movies/movie 3/.actors/actor 1.tbn
/share/movies/movie 3/.actors/actor 2.tbn
/share/movies/movie 3/.actors/actor 3.tbn