KSHスクリプトから変数を1行ずつ読み込むのに問題があります。

KSHスクリプトから変数を1行ずつ読み込むのに問題があります。

まず、私は最高のスクリプターではありません。 14日が経過した印刷ファイルをディレクトリから検索し、アーカイブディレクトリに移動するスクリプトを生成するように求められました。複数のディレクトリには対応するアーカイブディレクトリがあります。これをテストするために、ソースディレクトリとターゲットディレクトリを含む2つのテキストファイルを作成しました。各ファイルにディレクトリパスが1つしかない場合、問題はスムーズに進みました。ただし、各ファイルに異なるディレクトリパスを追加すると、スクリプトは最初のアーカイブフォルダを2番目のアーカイブフォルダに移動します。

最初の行のファイルは、printdirs.txt最初の行のパスに移動する必要がありますarchivedirs.txt。その後、ループが再実行され、パスの2行目のファイルがprintdirs.txtパスの2行目のファイルに移動されますarchivedirs.txt

スクリプトは次のとおりです。

#!/usr/bin/ksh

printlist=/u/lawson/stage/Scripts/printdirs.txt
archivelist=/u/lawson/stage/Scripts/archivedirs.txt

# Checking the archive list and moving files

for i in $(cat $printlist) ; do
    cd $i   
    /usr/bin/find . -mtime +14 -type f -exec mv "{}" $(cat $archivelist) \;

done

テキストファイルに含まれる内容は次のとおりです。

$ cat printdirs.txt
/u/lawson/law/print/lawson/tim/1
/u/lawson/law/print/dgfinance/monday190/1

$ cat archivedirs.txt
/u/lawson/law/print/archive
/u/lawson/law/print/archive2

「archive」フォルダを「archive2」フォルダにコピーせずにスクリプトが各行を繰り返すようにするにはどうすればよいですか?

アップデート:terdonの助けを借りてスクリプトが更新されました。 echoコマンドを追加した後の出力は次のとおりです。

# ./printarchive2.ksh 
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /lawson/tim/1      /u/lawson/law/print/archive {} +
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /dgfinance/monday190/1     /u/lawson/law/print/archive2 {} +

terdonが使用したいスクリプトは、ディレクトリパスから「t」を削除することです。 「t」を「n」に変更してテストしました。私のディレクトリパスから文字 "n"を削除しました。 Kornシェルが読み取ることができるタブフィールド区切り文字を表す他の方法はありますか? KSHでは動作しないようです。

ベストアンサー1

ここで使用しますpaste。これはファイルを結合するための素晴らしいツールです:

$ paste printdirs.txt archivedirs.txt 
/u/lawson/law/print/lawson/tim/1    /u/lawson/law/print/archive
/u/lawson/law/print/dgfinance/monday190/1   /u/lawson/law/print/archive2

上記のように、タブで区切られ、両方のファイルから連続した行を印刷します。ディレクトリ名にスペースを含めることができる場合は、タブ区切りが便利です。これで、出力を繰り返してpaste操作を実行できます。

#!/usr/bin/ksh

printlist="/u/lawson/stage/Scripts/printdirs.txt"
archivelist="/u/lawson/stage/Scripts/archivedirs.txt"

paste "$printlist" "$archivelist" | while IFS=$'\t' read source dest; do
    /usr/bin/find "$source" -mtime +14 -type f -exec mv -t "$dest" {}  +
done

cdi)必要なく、findどこからでもターゲットで実行できるものを削除しました。 ii)for i in $(cat foo)一般的に避けるべき構文を削除し、iii)呼び出しを試み、結合するより効率的な構文-exec ... \;に置き換えました。 、これが必要な理由です)。-exec +mv-t "$dest"

mvこの-tオプションがサポートされていない場合は、コマンドをもう一度変更してくださいfind

/usr/bin/find "$source" -mtime +14 -type f -exec mv "$source" "$dest" \;

おすすめ記事