名前が不明なディレクトリに移動


8

tarballを解凍しているときにls、「??????????????? ??????」と報告されるディレクトリに遭遇しました。おそらく、名前はユニコードではありませんか?とにかく、フォルダにアクセスする方法がわかりません。私は試しましたがcd $(find -inum inode_number)、それは私に与えます

"bash: cd: ./??????????: No such file or directory".

iノード番号でフォルダに直接アクセスする別の方法はありますか?


おそらく辞書リストの最初の語彙ですか?その後、cd */うまくいくかもしれません。*シェルが理解できるディレクトリの説明を展開し、cd余分な引数を無視します。別の方法は、グラフィカルファイルマネージャー(端末ベースのMCを含む)またはVimなどの組み込みのファイルツリーナビゲーターを使用することです。直接cd` -execへの切り替えfind, not with (これはシェルに組み込まれています)を試すこともできますが、eg lsや他のツールを使用します。
Daniel Andersson

@Daniel:一部のシェルではcd、複数の引数を使用すると失敗します。
スコット

@スコット:そうだね。POSIXは複数の引数の動作を指定しません。BashとDashは余分な引数を無視し、cshは " too many arguments"で終了します。
Daniel Andersson 2013年

回答:


3

任意のディレクトリ(またはファイル)を操作できるようにするための一般的なアプローチは、そのiノード番号を使用することです。

まず、lsを使用して、問題のフォルダーのiノードを取得します。

ls -lia
  • -l 長いリスト(オプション)
  • -i iノード値を取得する
  • -a 隠しファイルも含め、すべてのファイルを表示する(オプション)

リストの最初の列には、次のような長い数字が表示されます。

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

これで、次のコマンドを使用してそのディレクトリに変更できます。

cd "$(find -inum ######)"

...ただし、######をディレクトリ一覧で取得した長い番号に置き換えます。

もちろん、コマンドはである必要はありませんcd。それは可能性がありrmcpmvなど ...


2

文字は国際的な文字である可能性が高いため、en_US文字セットでは制御コードとして表示される可能性が高く、これがlsが疑問符として表示している理由です。

これは、グローバルプロファイルでデフォルトでディストリビューションがエイリアスlsを選択したことが原因である可能性があります。例えば:

alias ls='ls -q'

シェルに次のように入力して、ディストリビューションが完了しているかどうかを確認できます。

alias ls

次のようなものが出力されます:

$ alias ls
alias ls='ls --color=auto'

以下のリンク先のページでは、「ls -b」を実行すると、8進数の制御コードが表示されるため、少なくとも使用されている文字がわかります。

http://www.arsc.edu/arsc/support/howtos/nonprintingchars/

それがうまくいかないと仮定すると、下部にある別のオプションもあります:

今まで気付いていなかったOctalDumpと呼ばれるツール(Debian-/ usr / bin / od)

$ ls | od -b

制御コードの8進形式を表示します。

$ ls | od -c

最後にある可能性のある非表示の追加の空白を含む文字を表示します(例の最後にある余分なスペースに注意してください)

制御文字が機能していること、および追加の非表示の空白があるかどうかがわかったら、制御文字をエスケープすることにより、ディレクトリにcdする方法を簡単に見つけることができます。失敗した場合、ディレクトリの名前を変更するためのいくつかのオプションがあります。

上記のページには、便利なことに、スペースをエスケープするか、疑問符をエスケープしない限り、mvコマンドを介して制御文字を削除するための迅速でダーティな方法があります(したがって、単一文字にすること)ワイルドカード)、およびこの不正なディレクトリがあるディレクトリに他に何も存在しない限り。これらの明示的な要件の理由は、ワイルドカード文字と単一のスペースのみを使用しているため、ワイルドカードが他のファイルやディレクトリと誤って一致しないようにするためです。

上記の方法が機能しない場合は、別の方法で、他の応答で言及されているfindメソッドをほぼ確実に使用できます。iノード番号を使用してディレクトリにcdしようとするのではなく、iノード番号を使用して試したのではなく、iノード番号を使用して名前を変更できます。上記のページから、その1つのコマンドの3行のセット全体をコピーしてください(ただし、「desired-name」の部分を、名前を変更する実際の名前に置き換えます)。

ディレクトリの名前が変更されると、そのディレクトリにアクセスできるようになります。名前に制御コードが含まれているファイルも含まれていないことを願うだけです。そうしないと、名前を変更したディレクトリ内のすべてのファイル(および/またはサブディレクトリ)をリンスして繰り返す必要があり、その時点でforループはおそらく、1からインクリメントして、すべてのファイルに番号を付けるだけの方が賢明です。:-)


0

「?」シェルでは特別な意味があり、「何も含まない、任意の文字」を意味します。したがって、ファイルの名前が「??????????????? ?????」である場合 おそらく「?」をエスケープする必要があります (およびスペースを含む)cd \?\?\?\?\?\?\ \?\?\?\?(まだ試していない場合)

これは、誰かが意図的にファイルを、文字化け/破損/違法なエンコーディングではなく、扱いにくい名前にしたことを前提としています。


1
ただし、ASCII以外の文字(≥0x7F)を– として表示するのlsが好きであることを忘れないでください。そのため、ディレクトリ名は疑問符の文字列だけではない可能性があります。?
スコット

0

を行いますls。ディレクトリ(ファイルまたはサブディレクトリ)に、ミステリーサブディレクトリ(21、「??????????????? ?????」が正確)?次に、それらの名前を短い名前に変更するか、他のディレクトリに移動します。次に、

cd ????????????????????*

このワイルドカード(20の疑問符とそれに続くアスタリスク)は、20文字以上の任意の名前と一致する必要があります。–最初に行った指示では、ミステリーサブディレクトリがそのパターンに一致する唯一のものであることを確認する必要があります。しかし、それは行う方が便利かもしれません

mv ????????????????????* 新しい名前


3
lsいずれか--quoting-style=shellまたは--quoting-style=escapeオプションを指定して実行すると、そのファイル名の適切にエスケープされたバージョンを強制的に生成するのに役立ちます。
Dan D.

1
@DanD。わからなかったクールなオプションの+1。通常、このような問題に対処する必要がある場合は、GUIファイルマネージャーを使用しますが、コンソールまたはスクリプト内で作業する必要がある場合に便利です。
Joe

0

何が入っているかを確認する簡単な方法の1つは、FileZillaを使用してマシンにFTP送信することです。次に、FileZillaを使用してディレクトリの名前を変更できます。


0

Midnight Commander(テキスト)、Nautilus(GNOME)、Dolphin(KDE)などのファイルブラウザを使用して、ディレクトリを操作します。


0

名前を入力するのがおかしい/難しいディレクトリ(またはファイル)を操作するには:

1)実行ls -iして、ファイルのiノードを検出します。

このlsオプションは、ファイルの各名前と、ファイルシステム(inode)上のこのファイルの識別子を提供します

2)findを使用してファイルに対してコマンドを実行します

iノードが9961926だったと言う

あなたは走ることができた

 find * -prune -inum 9961926 -exec rm -i {} \;

ファイルを削除するには

または

 find * -prune -inum 9961926 -exec mv {} other-name \;

より良い名前に移動する

あるいは

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

古い名前を維持しながら新しい名前を付ける

(おそらく、他のコマンドも実行できます。残念ながら、この行を使用してを実行することはできませんでしたcd

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