如何使用脚本移动文件

如何使用脚本移动文件

我被要求设计一个脚本,在执行时,将参数中给出的文件类型移动到相应的文件夹(如果不存在,则创建具有文件类型的文件夹)。

就像假设我给出命令 ./M6.sh mp3 txt

这应该将当前工作目录中的所有 mp3 文件移动到名为“mp3”的文件夹中,并将所有 mp3 文件复制到该文件夹​​中,并将所有文本文件从当前工作目录移动到名为 txt 的文件夹中。

我编写了下面的代码,但我在使用 mv 命令时遇到了麻烦。

请帮忙。

在此输入图像描述

答案1

您的代码不必要地复杂。我认为问题在于,mv如果目标目录尚不存在,您将无法调用。您似乎还尝试将内容移动到根目录中的目录。

考虑

#!/bin/sh

for suffix do
    mkdir -p -- "$suffix" || exit 1
    mv -- *."$suffix" "$suffix"
done

或者,

#!/bin/bash

suffixes=( "$@" )

for suffix in "${suffixes[@]}"; do
    mkdir -p -- "$suffix" || exit 1
    mv -- *."$suffix" "$suffix"
done

(如果您想在无法创建目录时跳到下一个给定的后缀,而不是终止脚本,请更改exit 1为)。continue

这将循环所有文件名后缀(实际上不是文件类型作为 Unix 中的文件类型,例如“常规文件”、“目录”、“符号链接”等),将在当前目录中创建一个以该后缀命名的子目录,然后移动名称以."$suffix"该后缀结尾的所有文件目录。

如果目录已经存在,该命令mkdir -p dirname不会失败。dirname

运行示例:

$ tree
.
|-- file1.mp3
|-- file1.png
|-- file1.txt
|-- file2.mp3
|-- file2.png
|-- file2.txt
|-- file3.mp3
|-- file3.png
|-- file3.txt
|-- file4.mp3
|-- file4.png
|-- file4.txt
|-- file5.mp3
|-- file5.png
|-- file5.txt
`-- script.sh

0 directory, 16 files
$ ./script.sh txt mp3
$ tree
.
|-- file1.png
|-- file2.png
|-- file3.png
|-- file4.png
|-- file5.png
|-- mp3
|   |-- file1.mp3
|   |-- file2.mp3
|   |-- file3.mp3
|   |-- file4.mp3
|   `-- file5.mp3
|-- script.sh
`-- txt
    |-- file1.txt
    |-- file2.txt
    |-- file3.txt
    |-- file4.txt
    `-- file5.txt

2 directories, 16 files

答案2

当您使用 mv 命令时,您实际上是在尝试将其从根目录移动到文件夹。您的命令应该来自当前目录。

mv *.${myarray[$index]} ./${myarray[$index]}/

注意.前面的目录,它告诉您在当前目录中查找文件夹,否则您可以简单地编写:

mv *.${myarray[$index]} ${myarray[$index]}/

上面的命令还将查找当前目录中的文件夹。

相关内容