シェルスクリプトを使って次のことを達成したいと思います。ファイルを引数として使用してスクリプトを呼び出すと、ファイル名の一部に基づいてファイルを移動する必要があります。
たとえば、「自動車保険見積_zz21.pdf」は21にソートされます。自動車保険(FilingCabのサブフォルダ)「2012-09-01住宅保険見積_zz20.pdf」は20にソートされています。住宅保険(FilingCabのサブフォルダ)ファイルルーム)
論理的にはこのように読まなければならないと思います。古くからプログラミングをしてアルゴリズムはあると思っていましたが、コマンドや構文はありませんでした。
助けてくださった皆さん、本当にありがとうございました!
FileToMove = $1
FolderNo = (The number after zz and before a .)
ParentFolder = (~/FilingCab)
FolderList = (List of all folders in ParentFolder)
TargetFolder = (Folder among FolderList that begins with FolderNo) - use grep?
if TargetFolder <> not empty
cd ParentFolder
mv FileToMove to TargetFolder
end with success
else
do nothing
endif
end script
答え1
次のようにしてみてください。
#! /bin/bash
# Config variable(s)
ParentFolder="~/FilingCab"
# arg processing (minimalist :)
FileToMove="$1"
# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf/\1/')
# use find to search for subdirectories of parent folder that begin
# with the folder no followed by a '.'
TargetFolder=$(find "$ParentFolder" -maxdepth 1 -type -a -d -name "${FolderNo}.*")
NumFolders=$(echo "$TargetFolder" | wc -l)
if [ "$NumFolders" -eq 1 ] ; then
mv "$ParentFolder/$FileToMove" "$TargetFolder/"
else
echo "Error: $NumFolders beginning with "$FolderNo." found" >&2
exit 1
fi
すべての変数名の周りに二重引用符があります。これは常に安全で正しい操作ですが、あなたの場合は、例として提供されているファイル名とディレクトリ名にスペース文字が含まれているため、必須です。
-maxdepth 1
このコマンドは、find
$ParentFolderの直接サブディレクトリのみを検索します(つまり、サブディレクトリのサブディレクトリは無視されます)。それが意図した内容でない場合は、その部分を削除してください。find
$FolderNoで始まるサブディレクトリの$ParentFolderを検索します。
「TargetFolderがnullでない場合」という言葉が何を意味するのかわかりません。 「文字列$ TargetFolderがnullではありません」を意味するとします。通常、$TargetFolderが存在し、ディレクトリであることを確認しますが、aからディレクトリ名を取得するため、空またはディレクトリのみfind -type d
です。または、「$FolderNo」で始まる複数のエントリがある場合は、より多くの可能性があります。
クエリで正確に1つの結果が出ていることを確認する方が良いと思います。他の値はエラーなので、ファイルを移動できません。 0 は一致するフォルダが見つからないことを意味します。 2つ以上は、「$FolderNo」で始まる複数のフォルダを意味します。設立する。
stderr に送信される警告メッセージはオプションです。同じことexit 1
ですが、おすすめです。これにより、他のスクリプトからこのスクリプトを呼び出して成功したことを確認できます。