スクリプトを使用してファイルを移動する方法

スクリプトを使用してファイルを移動する方法

実行時に引数で指定されたファイル形式をそのフォルダに移動する(またはファイル形式がない場合は、そのファイル形式でフォルダを作成する)スクリプトを設計するように求められました。

私が./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]}/

上記のコマンドは、現在のディレクトリのフォルダも探します。

関連情報