9

ここには小さいけれど興味深い仕事があります。たとえば、同じ拡張子のファイルのリストがあります。

a.abc
b.abc
c.abc

ここで必要なのは、最初にファイルごとに、、 ...aというbフォルダーを作成してから、各フォルダーをそのフォルダーに移動することです。c.abc

cmd行を使用して最初のステップを非常に簡単に実行できましたがfind ... | sed ... | xargs mkdir...、同様のcmdを使用して各ファイルを独自のフォルダーに移動しようとすると、答えが見つかりませんでした。

私はここでcmdに精通していません、そして私はfindcmdでファイル/ディレクトリ名を再利用するためにある種の後方参照を使用できるという非常にあいまいな記憶を持っています、私はそれを間違って覚えていましたか?検索しましたが、適切なリファレンスが見つかりませんでした。

誰かがここでcmdを完了するのを手伝ってもらえますか?

ありがとう。

4

3 に答える 3

23

これがあなたのワンライナーです

find . -name "*.abc" -exec sh -c 'NEWDIR=`basename "$1" .abc` ; mkdir "$NEWDIR" ; mv "$1" "$NEWDIR" ' _ {} \;

または代わりに

find . -name "*.abc" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \;

これは、findman ページよりも優れた使用ガイドです。

このページでは、進行中のパラメーター展開について説明します (${1%.*}

于 2012-08-14T23:16:15.430 に答える
5

スペースを含むファイル名を処理するソリューションは次のとおりfindです。xargs

find . -type f -print0 | xargs -0 -l sh -c 'mkdir "${1%.*}" && mv "$1" "${1%.*}"' sh

改行やシェル展開可能な文字を含むファイル名はサポートされていないことに注意してください。

于 2012-08-14T23:41:00.890 に答える
2
for F in /tmp/folder/*.abc # replace by $1 for first arg
do
   BASE="${F%.abc}"
   mv "$F" "$BASE"
done
于 2012-08-14T22:26:48.810 に答える