How to use a while read filename; do to take filenames strip "(-to the end" and then create a directory with that information?

时间:2018-07-25 04:37:47

标签: bash

I have hundreds of movies saved as "Title (year).mkv". They are all in one directory, however, I wish to create a directory by just using the "Title" of the file and then mv the filename into the newly created directory to clean things up a little bit.

Here is what I have so far:

dest=/storage/Uploads/destination/
find "$dest" -maxdepth 1 -mindepth 1 -type f -printf "%P\n" | sort -n | {
while read filename ; do
echo $filename;
dir=${filename | cut -f 1 -d '('};
echo $dir;
# mkdir $dest$dir;
# rename -n "s/ *$//" *;
done;
}

~

dest=/storage/Uploads/destination/

is my working dirctory

find $dest -maxdepth 1 -mindepth 1 type f -printf "%P\n" | sort -n | {

is my find all files in $dest variable

while read filename ; do

as long as there's a filename to read, the loop continues

echo $filename

just so I can see what it is

dir=${filename | cut -f 1 -d '('};

dir = the results of command within the {}

echo $dir;

So I can see the name of the upcoming directory

mkdir $dest$dir;

Make the directory

rename -n "s/ *$//" *;

will rename the pesky directories that have a trailing space And since we have more files to read, starts over until the last one, and

done;
}

When I run it, I get"

./new.txt: line 8: ${$filename | cut -f 1 -d '('}: bad substitution

I have two lines commented so it won't use those until I get the other working. Anyone have a way to do what I'm trying to do? I would prefer a bash script so I can run it again when necessary.

Thanks in advance!

1 个答案:

答案 0 :(得分:0)

dir=${filename | cut -f 1 -d '('};无效。要运行命令并捕获其输出,请在管道中使用$( )echo文本。顺便说一下,cut将留下您可能不希望的尾随空格。

但是在不需要时不要使用cut之类的外部程序,bash扩展将为您做到这一点,并消除尾随空格:

filename="Title (year).mkv"

#  remove all the characters on the right after and including <space>(
dir=${filename%% (*}
echo "$dir"

给予

Title

一般语法为%% pattern ,以从右侧删除最长的 pattern 。模式使用glob(文件名扩展)语法,因此(*是一个空格,后跟(,然后是零个或多个任何字符。

%是最短的模式,###的功能相同,但从模式的左侧删除。