Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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 - Fatal编程技术网

Bash 根据文件名将文件移动到相应的文件夹

Bash 根据文件名将文件移动到相应的文件夹,bash,Bash,我在整理文件方面有点问题 因此,我有大约3000部电影的名字如下,因为有多部电影是相同的,但有不同的分辨率。以下是一个示例: Toy Story 4 (2019) - 720p h265 10 AAC 6ch.mkv Toy Story 4 (2019) - 1080p h265 10 AAC 6ch.mkv Toy Story 4 (2019) - 2160p h265 10 AAC 6ch.mkv X Men Apocalypse (2016) - 1080p h265 10 AAC 8ch

我在整理文件方面有点问题

因此,我有大约3000部电影的名字如下,因为有多部电影是相同的,但有不同的分辨率。以下是一个示例:

Toy Story 4 (2019) - 720p h265 10 AAC 6ch.mkv
Toy Story 4 (2019) - 1080p h265 10 AAC 6ch.mkv
Toy Story 4 (2019) - 2160p h265 10 AAC 6ch.mkv
X Men Apocalypse (2016) - 1080p h265 10 AAC 8ch.mkv
X Men Apocalypse (2016) - 720p h265 10 AAC 8ch.mp4
我想要的是将所有普通电影移动到一个普通文件夹中。像这样

Toy Story 4 (2019)
  Toy Story 4 (2019) - 720p h265 10 AAC 6ch.mkv
  Toy Story 4 (2019) - 1080p h265 10 AAC 6ch.mkv
  Toy Story 4 (2019) - 2160p h265 10 AAC 6ch.mkv
X Men Apocalypse (2016)
  X Men Apocalypse (2016) - 1080p h265 10 AAC 8ch.mkv
  X Men Apocalypse (2016) - 720p h265 10 AAC 8ch.mp4
我所有的电影都是这样命名的

我以前也遇到过类似的问题,问题解决了-

所以我尝试了同样的解决方案,不幸的是,它根本不起作用

我犯了这个错误

“$'\r': command not found”
非常感谢您的帮助


Ps:我也试过像Tinymediamanager这样的软件,但是它只能移动一部电影,而不是所有的电影,所以我找到了解决方案

在我上一篇文章中..一个用户给了我另一个bash脚本以用于任何其他实例..但是当我运行它时给了我错误..因为它不是UNIX格式..我使用Notepad++来更改格式,唉!。。它起作用了

谢谢大家的建议,谢谢大家

这是解决办法

#!/usr/bin/env bash

declare -A uniq

for files in *; do
  if [[ $files =~ ^(.*\(?[[:digit:]]{4}\)?)[\.[[:blank:]]]?(.+)$ ]]; then
    no_space=${BASH_REMATCH[1]// /.}
    uniq[$no_space]=1
    all_files+=("${BASH_REMATCH[0]}")
    first_part+=("${BASH_REMATCH[1]}")
  fi
done

for j in "${!uniq[@]}"; do
  mkdir -p "${j//[)(]}"
  dir+=("$j")
done

for i in "${!all_files[@]}"; do
  for k in "${dir[@]}"; do
  if [[ ${first_part[$i]// /.} == $k ]]; then
    mv -v  "${all_files[$i]}" "${k//[)(]}"
  fi
  done
done
在文件所在的文件夹中运行此命令


这是来自

我建议,除非你出于某种原因需要增加复杂性,否则尽量简单

代码速度较慢,效率较低,但如果单独编写,则更易于阅读

for f in *.mkv
do d="${f% - *}"
   mkdir -p "$d"
   mv "$f" "$d/"
done
如果你想加速的话-

for f in *.mkv
do [[ -e "$f" ]] || continue
   d="${f% - *}"
   mkdir -p "$d/"
   mv "$d"*.mkv "$d"
done

这难道不能实现您想要的吗?

我很困惑,您链接的问题在代码中有
python-3.x
linux
windows
bash
powershell
标记和一个
批处理文件
。您接受了
bash
答案。在这里,您在标记中执行相同的
bash
python
powershell
批处理文件
,而没有任何代码,使这个问题完全脱离主题。很抱歉,我对堆栈溢出非常陌生,我将尝试添加我使用的代码,并尝试更具体。谢谢您的编辑,我将撤回我的投票结果,同时请指出您对当前脚本存在的问题,因为“根本不起作用”并不表示存在实际问题。
$'\r'是windows CR字符。看起来你的脚本不知怎么接触了windows系统并被转换了。使用
dos2unix myScript`取消插入。在任何情况下,运行cmd都没有坏处。如果这还不能解决问题,请将该信息添加到Q的正文中(可能在顶部附近)。祝你好运,谢谢!这救了我…我将bas转换成UNIX并运行了它,唉!非常好,谢谢你,保罗·霍奇斯,我会试试这个,让你知道
for f in *.mkv
do [[ -e "$f" ]] || continue
   d="${f% - *}"
   mkdir -p "$d/"
   mv "$d"*.mkv "$d"
done