/ binの内容を/ usr / binに移動し、元に戻すことができますか?


18

Ubuntu 17.04を実行して、非リポジトリディストリビューションからソフトウェアをインストールしていました。ソフトウェアbin -folderの内容を/ usr / binに移動することになっていました(これはすでにわかりにくいアドバイスでした)

それは当時の一つなので、私が代わりにしたこと:

mv /bin/* /usr/bin

だから私はめちゃくちゃにして、誤ってbin内のすべてのファイルを/ usr / binに移動しましたが、/ binは空でした。/ binはシステムに不可欠であると考えているため、迅速な対処のために、/ usr / binの内容を/ binにコピーしました。

これで、/ binと/ usr / binの内容は同じになり、両方とも元々/ binと/ usr / binに分離されたファイルが含まれます。

  1. 現在、Ubuntuは壊れた状態ですか?(まだコンピューターを再起動しようとしませんでした、今はすべてがまだ動作しているようです)
  2. どのファイルが最近/ usr / binに移動/コピーされたかを知る方法はありますか?2.1通常、/ binと/ usr / binに重複するファイルがありますか
  3. 私がしたことを元に戻す他の方法はありますか?

私はタイムシフトをインストールしていないので、バックアップの復元はオプションではありませんが、現在のコンピューターには重要なものは何もありません。


2
dpkg-query -l | awk '{system( "dpkg-query -L" $ 2 "| grep -E \" ^ / usr / bin /.*$ \ "")}'これにより、最初に/ usr / binにあるすべてのファイルが表示されます。インストールされたパッケージ
ラマンサイロパル

7
@SatōKatsura /binはシステムに不可欠です。そのコンテンツは、初期のブート段階に存在する必要があります。/usrブート時にマウントされない可能性のあるパーティション(ここ)へのシンボリックリンクを作成する必要はありません。
xhienne

1
@xhienne再起動しても生き残るとは言いませんでした。システムを修復するのに十分な機能を取得するための一時的な修正です。
桂佐藤

1
@xhienneは、ディストリビューションの設定方法によって異なります。たとえば、Archは/binデフォルトでは個別に保持しません。Ubuntuのデフォルトのパーティション分割では、個別の/usrパーティションは作成されません。私は実際に/usr現代のディストリビューションで別の人を作る人がどれくらいいるのか興味があります。
ムル

1
@muru私のコメントを一般的なものとしてください。あなたはパーティションの数にあなたが望むものを何でも仮定することができます、私は好まないし、/ usr / bin / *を/ binにリンクすることを警告しています。FHSに続くシステムには、/ usr / binへのシンボリックリンクを含めることはできません。OPは、代わりにファイルをコピーすることをお勧めします。
xhienne

回答:


19

現在、Ubuntuは壊れた状態ですか?

はい、Ubuntuが壊れています

パッケージ管理にとって重要な何かを台無しにしました。

したがって、実際には、重要なデータ(少なくとも/etcおよび/home)をバックアップします。おそらく、インストールされたパッケージのリスト(例:の出力)をバックアップし、dpkg -lUbuntuを再インストールします。

(初心者でも他の回答と同じように管理しようとすることはできますが、そうすれば彼はそのような大きな基本的な間違いをしなかったでしょう)

Linuxパーティション全体を再インストールすることを認めることができます。

それはおそらくあなたの時間をより少なく消費するものです。他の回答を利用して現在のシステムを維持することは、システムを非常に乱雑な状態に保つことです(これは将来の頭痛の種になります)。

ディスクを再フォーマットするので/home、別のパーティションに入れることを検討してください(将来そのような間違いがデータを失わないように)。紙に印刷する前に、df -hand df -hiおよびfdisk -l(ディスク容量に関する情報を提供します-使用済みおよび使用可能の両方-...)。システムパーティション(ルートファイルシステム)を十分に大きくするのが賢明です。余裕があれば100Gバイトで十分です。

ソフトウェアbin -folderの内容を/ usr / binに移動することになっていた

(用語:Unixにはディレクトリがあり、「フォルダ」はありません)。

それは、(移動する/usr/bin/)は非常に間違っています。$ PATHを改善する(できれば)か、せいぜいsymlinksを追加して/usr/bin/、できればに実行可能ファイルを移動(またはsymlinksを追加)してください/usr/local/bin/

賢明なアプローチは、変更しないことです/usr/bin//bin/sbin/usr/sbin/ パッケージ管理ツールの外(例えばdpkgapt-getaptitude、など...)。FHSをお読みください。


4
この回答を受け入れます:回復しようとした後、デスクトップ環境セッションを起動できなくなった再起動まで動作したようです。それを修正しようとするのではなく、完全に台無しにして、Linuxパーティションを再インストールするだけです。すべてがバージョン管理されており、システムを1週間しか使用していなかったため、私が本当に失ったのは尊厳と小さなパニック発作だけでしたが、人生が教訓を教えてくれるのは普通のことのようです。
oneOfThoseDays

1
通り/bin/usr/binなりました同一のパッケージ管理をめちゃくちゃにされるだろう、なぜ、私はわかりません。本当に場合がある/bin/foo/usr/bin/fooの両方のパッケージ(複数可)によって提供されています。そうでない場合、いくつかの余分なファイルが浮かんでいます。
StrongBad

3
@Basileいいえ(不幸になりません); パッケージ管理は、知っているファイルのみを対象とし、知らないファイルについては文句を言いません。でも、それはファイルのためのない彼らが変更した場合についてを知って、それが特に気にされることはありません...
スティーブン・キット

2
@Basileも、「(初心者でも他の答えと同じように管理しようとすることはできますが、そうすれば彼はそのような大きな基本的な間違いをしなかったでしょう)」が本当だとは思わないでしょう;-)。専門家でさえ時々滑る!
スティーブンキット

1
FWIWメインシステムの/パーティションは12GBであり、開発(ヘッダーファイルと多くのツールを読む)オフィスとデザイン(重いツールを読む)、KDE(非スリムを読む)で使用しても、スペースの問題に遭遇することはありませんでした。分割しない場合は4GBを追加し/var、私よりも大きなマージンが必要な場合は25%増加します。20GBでは十分です。
スペクトル

36

Linux(および他のほとんどのシステムでは、POSIXはファイルシステム間を移動しない限りその保証を提供しませんが)、ctimeを更新するため/usr/bin、過去24時間以内に他のシステムのどれも変更されていないと仮定します、それらを元に戻すことができるはずです:

find /usr/bin/. ! -name . -prune -ctime -1 -exec sh -c '
   echo mv -i "$@" /bin' sh {} +

echo正しく見える場合は削除します。/binおよびに同じ名前で存在したファイルを復元することはできません/usr/bin(元のファイルは/usr/bin失われます)

潜在的な注意点:いくつかのファイルは、ハードの両方にリンクされている場合/bin/usr/bin、内のすべてのハードリンクは/usr/binに移動されるだろう/bin

さて、あなたはので、それを考えること/bin/usr/bin、デフォルトであり$PATH、かつ/bin上で利用可能である/boot前に、少なくとも/usr搭載されている、それは実行ファイルはであるべきではない問題かどうか/bin代わりに/usr/bin

しかし、多くのコマンドが実行可能ファイルのパスをハードコーディングし、それらが特定のケースにあることを期待していることは見落としがちです。一般的なケースは、シバンです。以下を含むすべてのスクリプト:

#! /usr/bin/env bash

あなたがしmv /usr/bin/env /bin/envた後に動作しません。その点で、両方の場所にコマンドがあると、それらのスクリプトを壊さないという点で安全です。


3
上記で触れたように(それはというディレクトリにすべてを移動しようとする重大なエラーだったように私は私のコメントを削除iUbuntuのようなGNU / Linuxシステム上の1を使用することができ、そのことについて--sorry!)find /usr/bin/. ! -name . -prune -ctime -1 -exec echo mv -it /bin {} +ので、GNUのCoreutilsmvサポートします-t。他のOS は一般的にそれをサポートしておらず、BusyBoxが提供する代替mv動作しません。
エリアケイガン

17
  1. インストールはほとんど問題ないはずです。/usrand /usr/bin(2.1に対応)に同じ名前の異なるファイルがあってはならないので、両方にすべてのファイルが含まれていて/bin/usr/bin(パッケージをアップグレードするまで)何も壊れません。あなたが今持っているかもしれない唯一の問題は、シンボリックリンクでバイナリを上書きした場合、壊れたシンボリックリンクです。これを修正するには、壊れたシンボリックリンクを探します:

    find -L /bin /usr/bin -type l -ls
    

    リストされたファイルに対応するパッケージを再インストールします(たとえば、/usr/bin/zsh壊れていると表示された場合は、ファイルがどのパッケージからのものであるかdpkg -S /bin/zsh /usr/bin/zshがわかります;で再インストールしますapt --reinstall install zsh)。

  2. ctimeで表示およびソートして、最近変更されたファイル(移動したファイルを含む)を表示できます。

    ls -ltc /bin
    
  3. あなたがしたことを取り消すための最良のアプローチは、cruftパッケージを使用し、それが見つけたファイル/binまたは/usr/binパッケージから来ていないファイルを削除することです:

    sudo apt install cruft
    sudo cruft -d "/ /usr"
    

    ファイルがのファイルへのシンボリックリンク/etc/alternativesである場合を除きます(この場合、ファイルはそのままにしておく必要があります)。


#! /bin/shまたはで始まるスクリプトを除きます。
桂佐藤

場合SatōKatsura@彼らはまだ罰金を動作しますsh両方にある/bin/usr/bin(すべてのファイルが今重複しています)。
スティーブンキット

1
cruftパッケージマネージャーはインストールされたファイルも追跡するため、このジョブに特別なツールは必要ありません。unix.stackexchange.com/questions/153260/…を参照してください。
Ned64

1
comm -12 <(ls /bin) <(ls /usr/bin)私がテストしたUbuntuシステムでいくつかのエントリを表示します。/bin/foo -> /usr/bin/fooを意味するいくつかはfoo失われていたでしょう。
ステファンシャゼラス

@ステファンはいああ、元のNUKEうリンクを移動...
スティーブン・キット

6

システムが多かれ少なかれ「壊れている」理由を詳しく説明することは教育的かもしれません。

  1. @ basile-starynkevitchが指摘しているように、パッケージ管理システムは、バイナリが存在/binするはずのときにバイナリを見つけた場合、ひどく混乱する可能性が/usr/binあります。
  2. 一部の(おそらく重要な)スクリプトは、1つのディレクトリまたは他のディレクトリで特定のバイナリを見つけるために固定されている場合があります(状況によっては、セキュリティの観点などから、の内容に依存しないことをお勧めし$PATHます)。
  3. 存在の区別である理由/bin/usr/bin、前者は、潜在的にブートの初期段階で実装されているパーティション上にあってもよいということです。このコンテキスト(つまり、システムの起動時)では、/bin/xxxおそらくバイナリがフルパスで参照されるだけでなく、/usr/binその時点でディレクトリがシステム上で利用できない可能性があります。(あなたの場合df /binとはdf /usr/bin、あなたが記載されている同じファイルシステム、または異なるものが表示されることがあり、おそらく最もデフォルトのインストールでは、これらの日は、同じパーティション内の両方のディレクトリを残します)。

したがって、あなたが持っている場合は、それを見ることができますdoubless 同じ両方でバイナリ/bin/usr/bin発生しません、その後、問題2と3を、そして1からの被害は軽微であります。たとえば、Re 1を削除しようとすると、パッケージが適切にアンインストールされない場合があります。アップグレードが「正しい」場所のコピーをアップグレードしようとしたが、「間違った」場所のコピーを無視しようとすると、アップグレードが文字化けする可能性があります。したがって、上記の救済策があまりにも劇的または複雑に思える場合は、システムをこの状態のままにしておくことで逃げることできます。

しかし、これが重要なシステムである場合、私は本当にそれに頼りません。

一般的なルール(これも@ basile-starynkevitchに似ています)は決して/usr/bin/binそして友達とは二度と猿になれません。彼らはディストリビューションに「属している」のです。

編集:ポイント3に関連して、systemd / Fedoraのコンテキストで/bintoのすべてのコンテンツを移動し/usr/bin、1番目を2番目にシンボリックリンクすることが理にかなっている理由についての議論があります。これは、自分でこれを行うことを推奨するものではありません(そのページは配布を行う人に宛てられています)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.