mv:セルスクリプトには対応するファイルまたはディレクトリがありません。

mv:セルスクリプトには対応するファイルまたはディレクトリがありません。

一部のファイルをあるフォルダから別のフォルダに移動するスクリプトを作成しましたが、次のエラーが発生します。 2つのフォルダを確認したところ、1つのフォルダにはそのファイルがあり、他のフォルダにはそのファイルがないことがわかりました。しかし、すべてのフォルダに表示されるのはなぜですか? 「mvはそのようなファイルやディレクトリを計算できません」

mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/194.199.68.165_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/194.42.17.124_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/195.113.161.13_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/203.159.127.3_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/212.199.61.205_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/212.51.218.235_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/213.73.40.105_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/41.225.7.4_tcp.folder/data/*': No such file or directory
mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/83.230.127.122_tcp.folder/data/*': No such file or directory
[esolve@kitty tcp_50x50]$ ls /home/wgong/project/capture/tcp_50x50/dest_folder/194.199.68.165_tcp.folder/
[esolve@kitty tcp_50x50]$ ls /home/wgong/project/capture/tcp_50x50/dest_folder/203.159.127.3_tcp.folder/data/
129.88.70.226   132.187.230.1    138.96.116.22   155.185.54.250   192.38.109.144  193.136.227.163  193.175.135.61  195.113.161.13  83.230.127.122
130.104.72.200  132.227.62.122   147.83.29.232   156.17.10.52     192.42.43.22    193.137.173.218  193.205.215.74  212.199.61.205
131.130.69.164  132.252.152.194  148.81.140.193  157.181.175.249  192.43.193.71   193.144.21.131   193.226.19.30   212.51.218.235
131.188.44.102  134.151.255.180  152.66.245.162  160.78.253.31    193.1.170.136   193.145.46.243   194.199.68.165  213.73.40.105
131.254.208.10  138.48.3.203     152.81.47.4     192.114.4.3      193.136.166.56  193.166.160.98   194.42.17.124   41.225.7.4

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

list=`ls dest_folder`
cd dest_folder
cwd=`pwd`
for folder in $list;do
        mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}
done

私はそれを走った/home/esolve/project/capture/tcp_50x50/

答え1

mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}

そこにある引用符()'は、シェルがワイルドカードを使用するのを防ぎます。コマンドはそのまま渡されますが、表示され*たディレクトリに呼び出さmvれたファイルが見つからないため失敗します。*

次に変更してください。

mv "${cwd}/${folder}/data"/* "${cwd}/${folder}"

(ディレクトリ名にスペースが含まれている場合は、問題を回避するために二重引用符を使用してください。*引用符の外側。)

ただし、空のディレクトリではまだエラーが発生します。 (同じ理由:ファイルがパターンと一致するものを見つけられない場合は、パターン自体をコマンドに引数として渡します。)

答え2

コードにはいくつかの問題があります。

list=`ls dest_folder`

ls改行なしで出力をに保存します$listls改行で区切られたファイル名のリストを出力します。newlineファイル名のすべての文字で有効なため、出力は安定して使用できません。たとえば、ls次を含むディレクトリの出力は、というファイルを含むディレクトリの出力aと同じです。ba<newline>b

 cd dest_folder

コマンドが失敗したことを確認していません。通常、コマンドの終了ステータスを確認する必要がありますが、これは特に場合に当てはまりますcd。残りのコマンドは、ユーザーが新しいディレクトリにあると仮定し、そうでないと深刻な結果をもたらす可能性があるためです。

cwd=`pwd`

POSIXシェルはすでに(a)変数の現在のディレクトリへのパスを保持している$PWDので、ここではそれを使用する必要はありませんpwd(特に一般的な場合は、コマンド置換はパスから末尾の改行文字を削除するため)。また、mv相対パスが許可されるため、絶対パスを作成する必要はありません。

for folder in $list;do

引用符のない変数は次のとおりです。分割+グローバルシェルの演算子。つまり、変数の内容が分割され($IFSスペース区切り記号の特殊規則に記載されている区切り文字に基づいて)、その分割によって引き起こされる各要素のワイルドカードを見つけて、一致するファイルのリストに展開できます。

ここでは分割が必要ですが、改行でのみ可能であり、ワイルドカードが必要ないため、無効にする必要があります。

 IFS='
 '; set -f
 for folder in $list
   mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}

同様に、変数を引用符で囲んでいないままにすることは、分割+グローバルオペレーター。ここではどちらも望ましくないので、変数を参照する必要があります。

*前述のように、ワイルドカードは引用符がない場合にのみ拡張されるため、引用符から削除する必要があります。以前を使用してワイルドカードを無効にした場合は、このコマンドを呼び出す前にそれを復元する必要がset -fあります。set +f

より良い書き方は次のとおりです。

cd dest_folder &&
  for folder in */;do
    mv -- "${folder}data/"* "$folder"
  done

ただし、いくつかの注意事項があります。

  • これにより、隠されたフォルダは除外され、dataフォルダから隠されたファイルは移動されません。
  • このプロセスで上書きされたファイルは確認されません(該当する-iオプションを追加する必要があるかもしれませんmv)。
  • を使用して、*/我々はループを回します。目次ただし、ディレクトリへのシンボリックリンクも含まれます。望ましくない場合は、[ -L "${folder%/}" ] && continueループ内に1つを追加する必要があります。
  • 隠されていないフォルダがないと、それ自体が*/拡張されるため、mvというファイルが見つからないというエラーが*/data/*発生します。同様に、フォルダに隠されていないファイルがない場合は、that-folder/data/*存在する情報です。

関連情報