Linux 将文件移动到不同的目录

Linux 将文件移动到不同的目录,linux,bash,unix,ubuntu,Linux,Bash,Unix,Ubuntu,我正在尝试将指定目录中的媒体和其他文件移动到另一个目录,如果不存在,则创建另一个目录(文件将进入该目录),并创建一个目录,其余具有不同扩展名的文件将进入该目录。我的第一个问题是,我的脚本没有创建新目录,也没有将文件移动到其他目录,我可以使用什么代码将具有不同扩展名的文件移动到一个目录 这就是我到目前为止所做的,纠正我的错误并帮助修改我的脚本: #!/bin/bash From=/home/katy/doc To=/home/katy/mo #directory where the media f

我正在尝试将指定目录中的媒体和其他文件移动到另一个目录,如果不存在,则创建另一个目录(文件将进入该目录),并创建一个目录,其余具有不同扩展名的文件将进入该目录。我的第一个问题是,我的脚本没有创建新目录,也没有将文件移动到其他目录,我可以使用什么代码将具有不同扩展名的文件移动到一个目录

这就是我到目前为止所做的,纠正我的错误并帮助修改我的脚本:

#!/bin/bash
From=/home/katy/doc
To=/home/katy/mo #directory where the media files will go
WA=/home/katy/do # directory where the other files will go
 if [ ! -d "$To" ]; then
   mkdir -p "$To"
 fi
cd $From
find path -type f -name"*.mp4" -exec mv {} $To \;


我会这样解决它:

#!/bin/bash
From=/home/katy/doc
To=/home/katy/mo # directory where the media files will go
WA=/home/katy/do # directory where the other files will go

cd "$From"
find . -type f \
| while read file; do
    dir="$(dirname "$file")"
    base="$(basename "$file")"
    if [[ "$file" =~ \.mp4$ ]]; then
      target="$To"
    else
      target="$WA"
    fi
    mkdir -p "$target/$dir"
    mv -i "$file" "$target/$dir/$base"
  done
注:

  • 如果目录已经存在,
    mkdir-p
    将不会抱怨,因此无需检查该目录
  • 在所有文件名周围加上双引号,以防它们包含空格
  • 通过将
    find
    的输出管道化到
    while
    循环中,您还可以避免被空格咬到,因为
    read
    将一直读到换行
  • 您可以根据口味修改正则表达式,例如
    \(mp3 | mp4 | wma | ogg)$
  • 如果您不知道,
    $(…)
    将运行给定的命令,并将其输出粘贴回
    $(…)
    (称为命令替换)的位置。它几乎与
    `…`
    相同,但稍好一些()
  • 要测试它,请将
    echo
    放在
    mv
    前面。(请注意,引号将在输出中消失。)

我正在尝试,但它不工作一个错误显示can not mv:没有这样的文件或目录它告诉我目标不是目录
find $From -type f -name "*.mp4" -exec mv {} $To \;
     ^^^^^
cd $From  
mv *.mp4 $To;  
mv * $WA;
#!/bin/bash
From=/home/katy/doc
To=/home/katy/mo # directory where the media files will go
WA=/home/katy/do # directory where the other files will go

cd "$From"
find . -type f \
| while read file; do
    dir="$(dirname "$file")"
    base="$(basename "$file")"
    if [[ "$file" =~ \.mp4$ ]]; then
      target="$To"
    else
      target="$WA"
    fi
    mkdir -p "$target/$dir"
    mv -i "$file" "$target/$dir/$base"
  done