ファイルのリストを含むディレクトリがあります。これらのファイルはすべて名前にスペースがあります。
拡張子を除いて、ファイル名を含む各ファイルのディレクトリを作成したいと思います(すべてのファイルの拡張子は.docです)。
たとえば、
私のディレクトリの内容
first file.doc
second file.doc
third file.doc
予想される結果
first file/first file.doc
second file/second file.doc
third file/third file.doc
作成するディレクトリ名を確認するには、次のコマンドを使用します。
find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'
結果は次のとおりです。
first file
second file
third file
各項目に対してディレクトリを作成する必要があることを理解してください。
私は成功せずに次のことを試しました。
find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}' -exec mkdir '{}' \;
#error with awk: it cannot open the file -exec because it does not exist
mkdir `find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'`
#it creates several directories per name because there are spaces in the names
mkdir `"find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'"`
#-bash: find . -maxdepth 1 -name *.doc | awk -F .doc '{print }': command not found
mkdir "`find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'`"
#it tries to create a unique directory with all the file names as a single name, which is not good of course
可能であれば、ファイル名からすべてのスペースを削除したいのですが、プロジェクトの制約に合うようにしてください。
これらのディレクトリを作成できるようになったら、一致するディレクトリ内のすべてのファイルを移動する方法を理解する必要があります。これはすべて1つのコマンドで実行できます。
私はbashとRedHat 2.6を使用しています。
ご協力ありがとうございます。ローラン
ベストアンサー1
そしてzsh
:
mkdir -p -- *.doc(:r)
または:
for f (*.doc) {
mkdir -p -- $f:r &&
mv -- $f $f:r/
}
同等bash
(すべてのPOSIXシェルでも動作しますがzsh
):
for f in *.doc; do
mkdir -p -- "${f%.*}" &&
mv -- "$f" "${f%.*}/"
done
(隠しファイルは含まれませんのでご注意ください)