示例场景:
我有多个以 结尾的文件.torrent
,我想将它们移动到同名的文件夹中。
例如给定以下文件:
abc.torrent
def.torrent
some files has spaces.torrent
or [special] (characters).torrent
or . (dots).torrent
xyz.torrent
我想将它们移动到具有完全相同名称的相应文件夹(如果存在),例如:
abc.torrent
进入abc/
def.torrent
进入def/
- 等等
如果该文件夹不存在,文件应该保持不变(因为它可能与不完整的下载有关)。
我认为 BitTorrent 没有这样的选项。如果是的话,我想找一些命令行来实现这一点。
或者,我想指定我的文件的源文件夹和包含预期目录的目标文件夹。
有任何想法吗?
答案1
非递归地:
for t in *torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done
该语法从变量末尾
${var%pattern}
删除最短匹配。在本例中,它只是删除扩展名。pattern
递归(使用
bash
):shopt -s globstar for t in **/*torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done
该
globstar
选项**
匹配任意文件和 0 个或多个目录。请注意,上述操作要求目标目录是 torrent 文件父目录的子目录。因此,如果文件位于foo/bar/baz.torrent
,它将被移动到foo/bar/baz/baz.torrent
。非递归地,如果不存在则创建目录:
for t in *torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done
该
-p
选项指示mkdir
如果目录已存在则不打印错误,并根据需要创建父目录。因此,如果和目录不存在,mkdir -p foo/bar/baz
也将创建它们。foo
bar
递归地,如果不存在则创建目录:
shopt -s globstar for t in **/*torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done
答案2
由于我在 OS X 版本的 BitTorrent 上找不到这样的选项,因此我编写了以下单行代码:
find . -name "*.torrent" -exec sh -c 'DST=$(find . -type d -name "$(basename "{}" .torrent)" -print -quit); [ -d "$DST" ] && mv -v "{}" "$DST/"' ';'
这将查找.torrent
当前目录中的文件 ( ),并递归查找在同一文件夹中找到的同名.
文件夹 ( )。要检查不同的目录,请将点 ( ) 更改为适当的目标。查看完整脚本:DST
.
.
mv_torrents.sh
。