フォルダ構造の図:
私は高度なシェル コマンドとスクリプトについてはまったくの初心者です。基本的なターミナルの知識はありますが、このような自動化を作成しようとしたことは一度もありません。まったくの初心者です。
この投稿では目標を簡略化しましたが、実際のプロジェクトは数千のフォルダーを対象とします。
基本的に、ソースフォルダと宛先フォルダがあります。ソースフォルダには、「Car」というプレフィックスの後に「3つの数字」が続くディレクトリがあります。
Source フォルダーに list.txt というテキスト ファイルがあり、これは 1 行あたり「3 つの数字」のリストです。
ディレクトリを見つけてリストを読み取るコマンドまたはスクリプトを作成したいと思います。ディレクトリ名の最後の 3 桁がリスト内の 3 桁と一致する場合、一致するフォルダーを宛先フォルダーに移動したいと思います。
find、-exec mv、xargs、“while IFS read” を使ったさまざまな方法を読みましたが、これに取り組む最善の方法がまったくわかりません。まだ始めたばかりなので、このフォーラムの誰かが私を攻撃せずに意見を述べてくれることを期待しています。
答え1
Destination
およびSource
(.
画像内)の親ディレクトリで実行するスクリプト:
#!/bin/sh
while IFS= read -r l; do
mv "Source/Car$l/" Destination/.
done < Source/list.txt
このスクリプトはSource/list.txt
行ごとに読み取ります。各行ごとに$l
、指定されたディレクトリSource/Car$l
を に移動しようとしますDestination/.
。
のドット パス名コンポーネントは、が存在しないDestination/.
場合のトリックです。が存在しない場合は、内に置くのではなく、最初の に名前が変更されます。 ドットによって違いが生じます。ターゲットが であり、が存在しない場合は、コマンドはエラーで終了します。Destination
Destination
mv "Source/Car…/" Destination/
Source/Car…/
Destination/
Destination/
Destination/.
Destination/
mv
脚本はバカ、 から読み取った内容の妥当性チェックは実行されませんSource/list.txt
。たとえば、 の行がある場合001/../../../../../../../../../../home/roco/.ssh
、スクリプトは~/.ssh/
ディレクトリを に移動するかもしれませんDestination/
。空行がある場合、スクリプトは に移動しようとしますSource/Car/
。最後の行が不完全な場合、 には移動しませんmv
(このwhile
ループはなぜ最後の行を認識しないのでしょうか?)。